熊大妈的奶牛在时针的带领下,围成了一个圆圈跳舞。由于没有严格的教育,奶牛们之间的间隔不一致。
奶牛想知道两只最远的奶牛到底隔了多远。奶牛A到奶牛B的距离为A顺时针走和逆时针走,到达B的较短路程。告诉你相邻两个奶牛间的距离,请你告诉奶牛两只最远的奶牛到底隔了多远。
Input
第一行一个整数N,表示有N只奶牛。(2<=N<=100000)。
接下来2~N+1行,第i行有一个数,表示第i-1头奶牛顺时针到第i头奶牛的距离。(1<=距离<=maxlongint,距离和<=maxlongint)
第N+1行的数表示第N头奶牛顺时针到第1头奶牛的距离。
Output
一行,表示最大距离。
Sample Input
5
1
2
3
4
5
Sample Output
7
先预处理出1号点到任意一点的顺时针处理一遍,转两圈(更好地二分)。每次用二分求出离任意1个点(A)比较远的两个个点,即B,C。如果一个点的顺时针和逆时针的差越小,就越接近离A最远的点,二分即可。不过退出二分后把点B或点C再搜一遍即可。
var
sum:Array [0..200010] of longint;
n,i,l,r,x,mid,y,max,min,he:longint;
begin
readln(n);
fori:=2 to n+1 do
begin
readln(x);
sum[i]:=sum[i-1]+x;
end;
fori:=n+2 to 2*n do
sum[i]:=sum[n+1]+sum[i-n];
max:=0;
fori:=1 to n do
begin
l:=i; r:=n+i;
min:=maxlongint;
while l<=r do
begin
mid:=(l+r) shr 1;
x:=sum[mid]-sum[i];
y:=sum[n+i]-sum[mid];
if abs(x-y)<min then
begin
min:=abs(x-y);
if x<y then he:=x else he:=y;
if he>max then max:=he;
end;
if l=mid then break;
if x<y then l:=mid else r:=mid;
end;
x:=sum[r]-sum[i];
y:=sum[n+i]-sum[r];
if abs(x-y)<min then
begin
min:=abs(x-y);
if x<y then he:=x else he:=y;
if he>max then max:=he;
end;
end;
writeln(max);
end.