JOI 君马上要和妹妹 JOI 子和 JOI 美一起吃小吃。今天的小吃是他们三个人都很喜欢的年轮蛋糕。

年轮蛋糕是像下图一样呈圆筒形的蛋糕。为了把蛋糕分给三个人,JOI 君必须沿着半径方向切 3 刀,从而把蛋糕分成三块。然而,由于年轮蛋糕硬得像实木一样,要让刀切进去并不简单。因此,这个年轮蛋糕上事先准备了 N 个切口,而 JOI 君只能在有切口的位置下刀。切口按顺时针顺序编号为 1到 N,对于 1≤i≤N−1,第 i 个切口和第 i+1个切口之间部分的大小是 Ai。第 N 个切口和第 1个切口之间部分的大小是 AN ​​。

图 1:一个年轮蛋糕的例子,N=6,A1=1,A2=5,A3=4,A4=5,A5=2,A6=4

妹控的 JOI 君在把蛋糕切成 3 块之后,自己选走最小的一块吃掉,把剩下两块分给两个妹妹。而另一方面,JOI 君太喜欢年轮蛋糕了,只要能吃到的时候就会想吃很多很多。试求:最小块的大小不超过多少。

样例说明 1


图 2:从第 1,3,5个切口下刀时是最优解(即图中粗实线位置)。

这道题用二分+二分。我们知道分一个蛋糕需要切三刀,第一刀枚举O(n),第二刀二分logN,第三刀二分logN,一共O(nlogn^2),可以过。

第一、二刀会把最小的一块给切走,然后留下一大块。

然后用第三刀切这一大块,如果这两块切完都比刚才切走的小,说明这一大块无论怎么切都切不出符合的结果,所以开始的一块切大了,第二刀往小切

如果前面一块小于刚切走的,说明第三刀要往后切;

如果后面一块小了,就往前切;

如果两块都可以,说明这种切法可行,第二刀尝试往更大的切。

注意所有数组下表的处理。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <stack>
#define in(a) a=read()
#define MAXN 200020
#define REP(i,k,n) for(long long i=k;i<=n;i++)
using namespace std;
inline long long read(){
long long x=,f=;
char ch=getchar();
for(;!isdigit(ch);ch=getchar())
if(ch=='-')
f=-;
for(;isdigit(ch);ch=getchar())
x=x*+ch-'';
return x*f;
}
long long n;
long long ans;
long long a[MAXN],s[MAXN];
inline bool check(long long i,long long k){
long long sum=s[i+k-]-s[i-];
long long loc=i+k-;
long long left=,right=n;
while(right-left>){
long long mid=(right+left)/;
if(s[loc+mid]-s[loc]<sum && s[i+n-]-s[loc+mid]<sum) return ;
if(s[loc+mid]-s[loc]<sum) left=mid;
if(s[i+n-]-s[loc+mid]<sum) right=mid;
if(s[loc+mid]-s[loc]>=sum && s[i+n-]-s[loc+mid]>=sum) return ;
}
return ;
}
int main(){
in(n);
REP(i,,n){
in(a[i]);
a[i+n]=a[i];
s[i]=s[i-]+a[i];
}
REP(i,,n)
s[i+n]=s[i+n-]+a[i+n];
REP(i,,n){
long long left=,right=n;
while(right-left>){
long long mid=(left+right)/;
if(check(i,mid)) left=mid;
else right=mid;
}
ans=max(s[i+left-]-s[i-],ans);
}
cout<<ans;
return ;
}

LOJ2758 年轮蛋糕的更多相关文章

  1. 【2018.10.1】「JOI 2014 Final」年轮蛋糕

    题面 一看到求“最小值的最大值”这种问题,就能想到二分了. 二分答案,然后我们要把一圈分成三块,使这三块的大小都$\geq mid$.做法是把环展开成2倍长度的链,先钦定一个起点,然后根据前缀和再二分 ...

  2. sprintf数据库查询的作用

    $sql = sprintf("UPDATE file SET mimetype=null,title=null,size=null,protected=null WHERE id=%d&q ...

  3. 国庆 Day1

    This is a 玄学 exam A.年轮蛋糕 最小的最大,二分首选 断环为链,check(x),x为答案,然后将每个大于x的子区间记录下来 如果有大于3个的话,那么x就可以是答案 那么·,在优化下 ...

  4. JOI2013-2019

    代码自己去LOJ看 JOI2013 彩灯 把序列划分成若干极长交替列,那么最优的方案一定是将一个极长交替列翻转使得连续的三个极长交替列合成一个.计算相邻三个极长交替列长度的最大值即可. 搭乘IOI火车 ...

随机推荐

  1. C#里面中将字符串转为变量名

    public partial class Form1 : Form { string str = "spp"; public string spp = "very goo ...

  2. hdu 3729 I'm Telling the Truth(二分匹配_ 匈牙利算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3729 I'm Telling the Truth Time Limit: 2000/1000 MS ( ...

  3. 转: oracle中schema指的是什么?

    看来有的人还是对schema的真正含义不太理解,现在我再次整理了一下,希望对大家有所帮助. 我们先来看一下他们的定义:A schema is a collection of database obje ...

  4. Ubuntu之设置应用开机自启动

    前言 前面使用oricle-Linux的时候,设置开机自启动使用的是chkconfig,现在使用ubuntu的时候发现Ubuntu系统没有了RH系统中的 chkconfig命令,因此研究了一下ubun ...

  5. sicily 1017. Rate of Return

    Description Jill has been investing in a mutual fund for a while. Since her income has varied, the a ...

  6. 关于boost 的smart_ptr 的使用问题

    boost 的smart_ptr 库中含有好几种智能指针,大家用的最多的应该是shared_ptr ,为啥呢?好用,不用管他啥时候会自动删除等等,而且拷贝和复制都很到位, 但实际上,这个库也有问题,连 ...

  7. 苹果的浏览器safari无法识别 2016-1-1这样的日期,会返回Invalid Date

    1.很多时候我们遇到的日期是2016-1-1这样的,中间是带横线的,但是有时候我们需要转化为标准的时间,即使用new Date(time)这样的方法,这时在safari浏览器里面Invalid Dat ...

  8. ireport报表制作, 通过节点、产品类型来判断,当该节点审核通过之后,报表相对应的审核意见及签名 显示相对应的内容

    1.代码①  (与本内容相关的代码:7~36)           以下类似 $P{P_XXXX} :均为页面端的传入参数 select so.sale_order_no as sale_order_ ...

  9. 画弧线DrawArc的研究-我自己 -- 直线交接圆角

    procedure TForm4.Button7Click(Sender: TObject); var pwith: Integer; //画笔的宽度 hx1, hy1: Integer; //横线第 ...

  10. LeetCode解题报告—— Minimum Window Substring && Largest Rectangle in Histogram

    1. Minimum Window Substring Given a string S and a string T, find the minimum window in S which will ...