Description
FJ 的N 头奶牛(2 <=N <=100, 000),分别站在一维篱笆上的许多地方。第i头奶牛站在坐标xi(0 <=xi <= 1, 000, 000, 000),是纯白色奶牛或者花斑奶牛。没有两头奶牛占据同样的位置,并且有至少一头白色奶牛。
为了郡交易会,FJ 想要给连续一段篱笆上的奶牛拍照。但是,为了对每种牛公平,他想要确保照片里白色奶牛和花斑奶牛的数量一样。一张照片的尺寸为照片里奶牛的最大坐标与最小坐标之差。FJ 想要知道所有公平的照片中,最大的尺寸有多大。
为了让他有更大的机会得到大一点的照片,FJ 拿来了一桶颜料,可以将任意数量的白色奶牛画成花斑奶牛。请帮助FJ 找到他能使用颜料的情况下所拍的公平照片的最大尺寸(当然,如果他认为保持原样更好的话,那么他不会使用颜料)。
Input
第一行:整数N。
第2 到N + 1 行:第i + 1 行包含xi 和字符‘W’ (一头白色奶牛)或字符‘S’ (一头花斑奶牛)。
Output
输出单独一行一个整数,在FJ 泼颜料之后他能拍到的公平照片的最大尺寸。
Sample Input
5
8 W
11 S
3 W
10 W
5 S
Sample Output
7
【样例解释】
FJ 将从坐标3 到坐标10 的奶牛拍成一张照片。这个范围内有4 头奶牛——3 头白色的和一头花斑的——所以他需要把其中任意一头白色奶牛画上花斑。
Data Constraint
对于10% 的数据,是题目的馈赠。
对于20% 的数据,N <=100。
对于30% 的数据,N <=1000。
对于40% 的数据,N <=20000。
对于所有数据,2 <=N <=100, 000,保证FJ 能拍到公平的照片。
.
.
.
.
.
.
.
分析
先对输入按照P值排序,然后令W=-1 S=1,开一个F数组记录前i头牛中,白色牛减去斑点牛的数量,最后统计答案。
.
.
.
.
.
.
.
.
程序:
uses math;
var
n,ans,m,i:longint;
ch:char;
b,a,f:array[0..1000001]of longint;
procedure px(l,r:longint);
var
w,i,j,mid:longint;
begin
if l>=r then exit;
i:=l;j:=r;mid:=a[(i+j) div 2];
repeat
while a[i]<mid do inc(i);
while a[j]>mid do dec(j);
if i<=j then
begin
w:=a[i];a[i]:=a[j];a[j]:=w;
w:=b[i];b[i]:=b[j];b[j]:=w;
inc(i);dec(j);
end;
until i>j;
px(l,j);
px(i,r);
end;
begin
assign(input,'pairphoto.in');
reset(input);
assign(output,'pairphoto.out');
rewrite(output);
readln(n);
for i:=1 to n do
begin
read(a[i]);
read(ch);
readln(ch);
if ch='W' then b[i]:=-1 else b[i]:=1;
end;
px(1,n);
fillchar(f,sizeof(f),127);
m:=n;
f[m]:=a[1];
for i:=2 to n do
begin
m:=m+b[i-1];
f[m]:=min(f[m],a[i]);
end;
for i:=2*n downto 0 do
f[i]:=min(f[i],f[i+2]);
m:=n;
for i:=1 to n do
begin
m:=m+b[i];
ans:=max(ans,a[i]-f[m]);
end;
write(ans);
close(input);
close(output);
end.