• [BZOJ] 1637: [Usaco2007 Mar]Balanced Lineup


    1637: [Usaco2007 Mar]Balanced Lineup

    Time Limit: 5 Sec  Memory Limit: 64 MB
    Submit: 697  Solved: 463
    [Submit][Status][Discuss]

    Description

    Farmer John 决定给他的奶牛们照一张合影,他让 N (1 ≤ N ≤ 50,000) 头奶牛站成一条直线,每头牛都有它的
    坐标(范围: 0..1,000,000,000)和种族(0或1)。 一直以来 Farmer John 总是喜欢做一些非凡的事,当然这次照相
    也不例外。他只给一部分牛照相,并且这一组牛的阵容必须是“平衡的”。平衡的阵容,指的是在一组牛中,种族
    0和种族1的牛的数量相等。 请算出最广阔的区间,使这个区间内的牛阵容平衡。区间的大小为区间内最右边的牛
    的坐标减去最做边的牛的坐标。 输入中,每个种族至少有一头牛,没有两头牛的坐标相同。

    Input

    行 1: 一个整数: N 行 2..N + 1: 每行两个整数,为种族 ID 和 x 坐标。

    Output

    行 1: 一个整数,阵容平衡的最大的区间的大小。

    Sample Input

    7
    0 11
    1 10
    1 25
    1 12
    1 4
    0 13
    1 22

    Sample Output

    11

    HINT

    输入说明 


    有7头牛,像这样在数轴上。 


     

    输出说明 

     

    牛 #1 (at 11), #4 (at 12), #6 (at 13), #7 (at 22) 组成一个平衡的最大的区间,大小为 22-11=11 个单位长度。 

     

    Source

    Silver

    Analysis

    前缀和qwq

    记种族1为1,种族0为-1,求得这个数轴上的每头牛的前缀和

    当两头牛的前缀和相同的时候,他们之间的1族牛和0族牛就是一样多的

    但是不能直接选 i 和 j 的前缀和,应该比较 i-1 和 j

    因为是 他们之间的1族牛和0族牛一样多

    一个左开右闭区间嗯

    具体实现不难

    Code

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<algorithm>
     4 #define maxn 1000000
     5 using namespace std;
     6 
     7 int n,race[maxn],ans,pos[maxn];
     8 
     9 struct cow{
    10     int race,pos;
    11 }list[maxn];
    12 
    13 struct edge{
    14     int from,pos;
    15 }e[maxn];
    16 
    17 int tot,first[maxn];
    18 void insert(int val,int pos){
    19     tot++; e[tot].from = first[val]; e[tot].pos = pos; first[val] = tot;
    20 }
    21 
    22 bool cmp(const cow &a,const cow &b){
    23     return a.pos < b.pos;
    24 }
    25 
    26 bool cmp2(const cow &a,const cow &b){
    27     if(a.race == b.race) return a.pos < b.pos;
    28     else return a.race < b.race;
    29 }
    30 
    31 //int find(int x){
    32 //    int L = 1,R = n,mid;
    33 //    while(L < R){
    34 //        mid = (L+R)/2;
    35 //        if(list[mid].)
    36 //    }
    37 //}
    38 
    39 int main(){
    40     scanf("%d",&n);
    41     
    42     for(int i = 1;i <= n;i++){
    43         scanf("%d%d",&race[i],&pos[i]);
    44         if(!race[i]) race[i]--;
    45         list[i].race = race[i],list[i].pos = pos[i];
    46     }
    47     
    48     sort(list+1,list+1+n,cmp);
    49     
    50     for(int i = 2;i <= n;i++){
    51         list[i].race += list[i-1].race;
    52         insert(list[i].race,list[i].pos);
    53     }
    54     
    55     for(int i = 1;i <= n;i++){
    56         int p = first[list[i-1].race];
    57         p = e[p].pos;
    58 //        printf("~%d %d
    ",i,p);
    59         ans = max(p-list[i].pos,ans);
    60     }
    61     
    62     printf("%d",ans);
    63     
    64     return 0;
    65 }
    qwq
    转载请注明出处 -- 如有意见欢迎评论
  • 相关阅读:
    【转】Windows守护进程的一种简单实现
    vim 文本会在末尾自动添加换行 md5文件和数据只不对应
    指向指针的指针的理解和应用
    TinyXML C++解析XML
    加密解密 AES RSA MD5 SHA
    微信支付 php兼容问题
    sublime text 2 php 语法错误检查
    微信支付宝支付
    MySql安装和基本管理
    验证码处理
  • 原文地址:https://www.cnblogs.com/Chorolop/p/7574531.html
Copyright © 2020-2023  润新知