zoukankan      html  css  js  c++  java
  • 【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.
    
  • 相关阅读:
    scala :: , +:, :+ , ::: , ++ 的区别
    Scala 函数式编程思想
    Scala 关键字
    HDFS 的内存存储是什么?
    LRU
    高并发情况限流
    Java中List集合去除重复数据的方法
    MySQL支持的跨库事务
    死磕ConcurrentHashMap 1.8源码解析
    一致性Hash算法
  • 原文地址:https://www.cnblogs.com/YYC-0304/p/9499985.html
Copyright © 2011-2022 走看看