先预处理后一段的信息,然后前半段从前往后遍历一次,更新答案即可
#include<bits/stdc++.h> using namespace std; #define N 200005 int n,a[N]; map<int,int>mp; int main(){ int t;cin>>t; while(t--){ cin>>n; mp.clear(); for(int i=1;i<=2*n;i++)cin>>a[i]; int now=0;mp[0]=2*n+1; for(int i=2*n;i>=n+1;i--){ if(a[i]==1)now++; else now--; mp[now]=i; } int ans=0; if(mp[0]!=0) ans=2*n-mp[0]+1; now=0; for(int i=1;i<=n;i++){ if(a[i]==1)now++; else now--; if(mp[-now]!=0) ans=max(ans,i+2*n-mp[-now]+1); } cout<<2*n-ans<<' '; } }