C. Berry Jam(前缀后缀和+思维好题)

    技术2022-07-10  121

     

     

    有 2*n 个罐子,分别是草莓酱和蓝莓酱,要求从中间开始向左或向右吃掉任意罐,使得两种果酱数量相等

    这个题我们将蓝莓酱定义为 -1 ,这样两种罐子相等的话,那么总和为 0 

    我们前缀和求出前 2*n 罐的前缀和,这样前缀和[1,L]中如果有一个后缀和[R,n*2]与其是相反数,那么答案就应该是吃掉 [L+1,R-1] 区间内的罐子 R-L-1;

    const int N=2e5+5; int n,m,t; int i,j,k; int a[N]; map<int,int> pos; int sum[N]; void go(int x,int y) { if(x==y){ cout<<0<<endl; return ; } if(x==0){ cout<<y<<endl; return ; } if(y==0){ cout<<x<<endl; return ; } int ans=inf; for(int i=n;i<=(n<<1);i++){ int tmp=sum[i]-sum[n<<1]; //i+1 ~ 2*n 的后缀和的相反数 if(pos.find(tmp) != pos.end()) ans=min(ans,i+1-pos[tmp]-1); } cout<<ans<<endl; } int main() { IOS; rush(){ cin>>n; int have1=0,have2=0; pos.clear(); ms(sum,0); pos[0]=0; //如果前缀和没有 0 的话,而后缀和有 0 的情况 for(i=1;i<=2*n;i++){ cin>>a[i]; if(a[i]==1) have1++; else{ have2++; a[i]=-1; } sum[i]=sum[i-1]+a[i]; if(i<=n) pos[sum[i]]=i; } go(have1,have2); } //PAUSE; return 0; }

     

    Processed: 0.009, SQL: 9