[BZOJ] 1637: [Usaco2007 Mar]Balanced Lineup
生活随笔
收集整理的這篇文章主要介紹了
[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
70 11
1 10
1 25
1 12
1 4
0 13
1 22
Sample Output
11HINT
?
輸入說明?
有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?
轉載于:https://www.cnblogs.com/Chorolop/p/7574531.html
總結
以上是生活随笔為你收集整理的[BZOJ] 1637: [Usaco2007 Mar]Balanced Lineup的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Project Euler Proble
- 下一篇: Linux系统巡检项目