有 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;
}