BZOJ 1637 [Usaco2007 Mar]Balanced Lineup

【题解】

  套路题。。其实也很好想。。

  把id为0的当成id为-1的,然后求前缀和,这样-1和1就可以相互抵消。也就是如果sum[i]=sum[j],那么x[i]-x[j+1]就是一个合法的答案。我们用first[i]记录满足sum[j]=i的j里面a[j+1]的最小值。

  

 1 #include<cstdio>
 2 #include<algorithm>
 3 #define N 200010
 4 #define rg register
 5 using namespace std;
 6 int n,b[N],s[N],ans,f[N];
 7 struct rec{
 8     int id,x;
 9 }a[N];
10 inline int read(){
11     int k=0,f=1; char c=getchar();
12     while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
13     while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar();
14     return k*f;
15 }
16 inline bool cmp(rec a,rec b){return a.x<b.x;}
17 int main(){
18     n=read();
19     for(rg int i=1;i<=n;i++) a[i].id=read(),a[i].x=read();
20     sort(a+1,a+1+n,cmp);
21     for(rg int i=1;i<=n;i++) s[i]=s[i-1]+(!a[i].id?-1:1);
22     for(rg int i=1;i<=n;i++) if(f[s[i]]) ans=max(ans,a[i].x-f[s[i]]); else f[s[i]]=a[i+1].x;
23     printf("%d\n",ans);
24     return 0;
25 } 
View Code

 

  

posted @ 2018-04-19 07:41  Driver_Lao  阅读(108)  评论(0编辑  收藏  举报