题解:这个嘛,虽然一次性AC了,但是还是有好多的波折——一开始想了半天才有了思路,然后写写写写写,然后中途硬是被打断干别的,然后回来啥都忘了,然后重新瞎折腾代码越改越乱心里越来越烦,然后最后看样子似乎有模有样了,然后Accept,然后没有然后了(想到兴头上被打断思路简直要命啊有木有)。。。好了,说思路——先按照各个牛的位置排个序,然后假如种族为0记-1,1记1,则问题转化为了求最长的和为0的区间,接下来就好办了——记录下同一前缀和的最早出现时间和最晚出现时间,然后找最大时间差即可。。。
var
i,j,k,l,m,n:longint;
a,b,c,f:array[0..100000] of longint;
d,e:array[-60000..60000] of longint;
procedure swap(var x,y:longint);
var z:longint;
begin
z:=x;x:=y;y:=z;
end;
procedure sort(l,r:longint);
var i,j,x,y:longint;
begin
i:=l;j:=r;
x:=a[(l+r) div 2];
repeat
while a[i]<x do inc(i);
while a[j]>x do dec(j);
if i<=j then
begin
swap(a[i],a[j]);
swap(b[i],b[j]);
inc(i);dec(j);
end;
until i>j;
if l<j then sort(l,j);
if i<r then sort(i,r);
end;
begin
readln(n);
for i:=1 to n do
begin
readln(b[i],a[i]);
if b[i]=0 then b[i]:=-1;
end;
sort(1,n);
c[0]:=0;
for i:=1 to n do
c[i]:=c[i-1]+b[i];
fillchar(d,sizeof(d),-1);
fillchar(e,sizeof(e),-1);
for i:=0 to n do
begin
if (d[c[i]]=-1) then d[c[i]]:=i;
e[c[i]]:=i;
end;
l:=0;
for i:=-50000 to 50000 do
begin
if e[i]<=d[i] then continue;
if (a[e[i]]-a[d[i]+1])>l then l:=a[e[i]]-a[d[i]+1];
end;
writeln(l);
end.