vijos 1894 セチの祈り

题面链接

(题面的背景可以说是非常做作了(来自文科生的嘲笑))

背景

琼花飘落 彩蝶曼舞 又是一年春

满腹愁情 化作伤春酒

梧桐细雨 影影绰绰 残阳落

韶华飞逝 梦断都成空

描述

在 Ninian 的花园里,有许多琼花,环绕着中间的凉亭。

有 N 片琼花,组成一个环。

Ninian 想在凉亭中发动 [セチの祈り] , 需要划分出三个区域的琼花,为了平均,要最大化面积最小的区域的面积。

划分区域:即用三刀把这个环分成三段,每段称之为一个区域。

格式

输入格式

第一行一个整数 N 。

接下来 N 个整数 Si ,表示第 i 片琼花的面积。

输出格式

输出一个整数,面积最小的区域的面积。

样例1

样例输入1

6
1
5
4
5
2
4

样例输出1

6

样例2

样例输入2

30
1
34
44
13
30
1
9
3
7
7
20
12
2
44
6
9
44
31
17
20
33
18
48
23
19
31
24
50
43
15

样例输出2

213

限制

对于 20% 的数据:

3 ≤ N ≤ 400

对于 100% 的数据:

3 ≤ N ≤ 100 000

1 ≤ Ai ≤ 1 000 000 000

来源

布吉岛。



题解

二分+贪心

记录前缀和s

i从0到n扫, 加上末尾的一部分(末尾二分贪心取最大)作为一段

中间的一段二分.

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<set>
 6 #include<ctime>
 7 #include<vector>
 8 #include<cmath>
 9 #include<algorithm>
10 #include<map>
11 #define inf 1000000000
12 #define ll long long
13 #define rep(i,a,b) for (int i = a; i <= b; ++ i)
14 using namespace std;
15 const ll MAXN = 100000+10;
16 inline ll read()
17 {
18     ll x=0,f=1;char ch=getchar();
19     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
20     while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
21     return x*f;
22 }
23
24 ll s[MAXN], a[MAXN], n, midans, ans;
25
26 ll findans(ll l, ll r, ll init) {
27     ll mid, ans(-1), R = r;
28     while (l <= r) {
29         mid = (l+r) >> 1;
30         if (s[R] - s[mid-1] + init >= midans) ans = mid, l = mid + 1;
31         else r = mid - 1;
32     }
33     return ans;
34 }
35
36 ll jud() {
37     rep(i,0,n) {
38         ll x = findans(i+1,n,s[i]),
39         y = findans(i+1,x-1,0);
40         if (y == -1 || x == -1) continue;
41         if (s[y-1] - s[i] >= midans) return 1;
42     }
43     return 0;
44 }
45
46 int main() {
47     n = read();
48     rep(i,1,n) a[i] = read();
49     rep(i,1,n) s[i] = s[i-1] + a[i];
50     ll l(0), r(s[n]);
51     while (l <= r) {
52         midans = (l+r) >> 1;
53         if (jud()) ans = midans, l = midans + 1;
54         else r = midans - 1;
55     }
56     printf("%lld",ans);
57     return 0;
58 }
时间: 2024-08-11 00:25:11

vijos 1894 セチの祈り的相关文章

Vijos P1066 弱弱的战壕【多解,线段树,暴力,树状数组】

弱弱的战壕 描述 永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了-_-b. mx在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限(“mx不赢定了?!?”永恒[email protected][email protected]). 但是,战壕有一个弱点,就是只能攻击它的左下方,说白了就是横纵坐标都不大于它的点(mx:“我的战壕为什么这么菜”ToT).这样,永恒就可以从别的地方进攻摧毁战壕,从而消灭mx的部队. 战壕都有一个保护范围,同它的攻击

Vijos P1785 同学排序【模拟】

同学排序 描述 现有m位同学,第1位同学为1号,第2位同学为2号,依次第m位同学为m号.要求双号的学生站出来,然后余下的重新组合,组合完后,再次让双号的学生站出来,重复n次,问这时有多少同学出来站着? 样例1 样例输入1 1989 5 样例输出1 1926 限制 1s 提示 [数据范围] 1≤n≤10 100≤m≤100000 题目链接:https://vijos.org/p/1785 分析:站出序号为偶数的人,如果总人数为奇数,剩余人数向上取整再折半就好了! 下面给出AC代码: 1 #incl

祈言机长,我哋喺七点整嘅时候接到匿名

"停飞?接受纪律调查?我今日嘅飞行任务系三天前安排出嚟嘅,十二个钟之前,我都冇接到任何停飞嘅通知.突然间要调查我,唔该畀个合理嘅解释."靳祈言声如履一层薄冰,佢冷漠俊面冇任何情绪起伏,佢犀利嘅眼眸认真与行政经理对视住."靳祈言机长,我哋喺七点整嘅时候接到匿名举报封信.就凭举报信入面嘅相,我哋正祈言嘅质疑,都无视佢系太子爷嘅身 "靳祈言机长,方便话畀我哋嗰个女人嘅联系电话啊?我哋要同佢求证寻晚嘅事.仲有呀,你寻晚去酒吧揾边个?佢可以帮你作证吗?唔该你仔细谂清楚寻晚喺酒

如果畀祈言知个女人,搅到一屎窟嘅麻烦,跟

"温机长,查到咗嗰位叫云水漾嘅乘客嘅登机信息.佢已经乘坐七点五十分嘅航班走咗去意大利米兰,飞机已经走成两个钟喇."冇好气嘅,温良裕低咒一声.如果畀祈言知个女人,搅到一屎窟嘅麻烦,跟住又一走了之喇,佢肯定想弄死佢!祈言遇到咁一个极品女人,佢都真系惨嘅!霎时间间,温良裕帮靳祈言默哀三秒钟."温机长,仲要帮手呀?"靳南生去咗审讯室,佢喺靳祈言嘅对面坐低,审查官通气褪咗出去.量,按理,我哋可以结束调查放人喇.""祈言,你可以走喇." http:

Vijos 1057 盖房子

二次联通门 : Vijos 1057 盖房子 /* Vijos 1057 盖房子 简单的dp 当前点(i, j)所能构成的最大的正方形的边长 为点(i - 1, j - 1)与(i, j - 1), (i - 1, j)三点中最小的边长构成.. 一遍递推, 一边取最大即可 */ #include <cstdio> #define Max 1009 inline int min (int a, int b) { return a < b ? a : b; } inline int max

Vijos 1193 扫雷 【动态规划】

扫雷 描述 相信大家都玩过扫雷的游戏.那是在一个n*n的矩阵里面有一些雷,要你根据一些信息找出雷来.万圣节到了,"余"任过流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字表示和他8连通的格子里面雷的数目.现在棋盘是n*2的,第一列里某些格子是雷,而第二列没有雷,如:o 1* 2* 3* 2o 2* 2* 2 ('*'代表有雷,'o'代表无雷)由于第一类的雷有可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息求第一列雷有多少中摆放方案.

Vijos 1523 贪吃的九头龙 【树形DP】

贪吃的九头龙 背景 安徽省芜湖市第二十七中学测试题 NOI 2002 贪吃的九头龙(dragon) Description:OfficialData:OfficialProgram:Converted by JackDavid127 描述 传说中的九头龙是一种特别贪吃的动物.虽然名字叫"九头龙",但这只是说它出生的时候有九个头,而在成长的过程中,它有时会长出很多的新头,头的总数会远大于九,当然也会有旧头因衰老而自己脱落. 有一天,有M个脑袋的九头龙看到一棵长有N个果子的果树,喜出望外,

vijos P1448 校门外的树

描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的……如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作:K=1,K=1,读入l.r表示在区间[l,r]中种上一种树,每次操作种的树的种类都不同K=2,读入l,r表示询问l~r之间能见到多少种树(l,r>0) 输入格式 第一行n,m表示道路总长为n,共有m个操作接下来m行为m个操作 输出格式 对于每个k=2输出一个答案 提示 范围:20%的数据保证,n,m<=10060%的数据保证

Vijos P1061 迎春舞会之三人组舞 DP

题目链接:https://vijos.org/p/1061 n个人选出3*m人,排成m组,每组3人. 站的队形——较矮的2个人站两侧,最高的站中间. 从对称学角度来欣赏,左右两个人的身高越接近,则这一组的“残疾程度”越低. 计算公式为 h=(a-b)^2 (a.b为较矮的2人的身高)现在候选人有n个人,要从他们当中选出3*m个人排舞蹈,要求总体的“残疾程度”最低; input: 第一排为m,n. 第二排n个数字,保证升序排列. 思路:由于和中间高的人无关,但是每次选旁边两个的时候,会由于没有比这