【差分+前缀和】BZOJ1637: [Usaco2007 Mar]Balanced Lineup
生活随笔
收集整理的這篇文章主要介紹了
【差分+前缀和】BZOJ1637: [Usaco2007 Mar]Balanced Lineup
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Description
Farmer John 決定給他的奶牛們照一張合影,他讓 N (1 ≤ N ≤ 50,000) 頭奶牛站成一條直線,每頭牛都有它的坐標(范圍: 0..1,000,000,000)和種族(0或1)。 一直以來 Farmer John 總是喜歡做一些非凡的事,當然這次照相也不例外。他只給一部分牛照相,并且這一組牛的陣容必須是“平衡的”。平衡的陣容,指的是在一組牛中,種族0和種族1的牛的數量相等。 請算出最廣闊的區間,使這個區間內的牛陣容平衡。區間的大小為區間內最右邊的牛的坐標減去最做邊的牛的坐標。 輸入中,每個種族至少有一頭牛,沒有兩頭牛的坐標相同。
?
Solution
設s[i]為前i頭牛為1的牛數-為0的牛數
顯然對于合法區間(l,r],s[l]==s[r]
掃一遍對于每個s統計下最左和最右就行了
秒之
?
Code
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 const int maxn=1e5+5; 5 6 struct cow{ 7 int dfn,dis; 8 bool operator<(const cow&b) 9 const{return dis<b.dis;} 10 }a[maxn]; 11 int s[maxn],l[maxn],r[maxn]; 12 int n; 13 14 int main(){ 15 scanf("%d",&n); 16 for(int i=1;i<=n;i++) 17 scanf("%d%d",&a[i].dfn,&a[i].dis); 18 sort(a+1,a+n+1); 19 20 for(int i=1;i<=n;i++){ 21 if(a[i].dfn) s[i]=s[i-1]+1; 22 else s[i]=s[i-1]-1; 23 int x=s[i]+n; 24 if(!l[x]) l[x]=i; 25 else r[x]=i; 26 } 27 28 int ans=0; 29 for(int i=0;i<=2*n;i++) 30 if(l[i]&&r[i]) ans=max(ans,a[r[i]].dis-a[l[i]+1].dis); 31 printf("%d\n",ans); 32 return 0; 33 }?
轉載于:https://www.cnblogs.com/xkui/p/4562402.html
總結
以上是生活随笔為你收集整理的【差分+前缀和】BZOJ1637: [Usaco2007 Mar]Balanced Lineup的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL注入的原理解说,挺好!
- 下一篇: 在公网(internet)上建立webs