【Usaco2014Open银组】照相(pairphoto)

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.

转载于:https://www.cnblogs.com/YYC-0304/p/9499985.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值