[BZOJ] 1637: [Usaco2007 Mar]Balanced Lineup
1637: [Usaco2007 Mar]Balanced Lineup
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 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
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
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 }
转载请注明出处 -- 如有意见欢迎评论