[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\n",i,p);
59         ans = max(p-list[i].pos,ans);
60     }
61     
62     printf("%d",ans);
63     
64     return 0;
65 }
qwq

 

posted @ 2017-09-22 13:56  Leviaton  阅读(161)  评论(0编辑  收藏  举报