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 }