@[DANXIBAO_Hhh](/user/681893)
```CPP
#include<bits/stdc++.h>
using namespace std;
int n,a[1000005],q[2*1000005],m=100005,ans=-1e9;
int main (){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]==0)a[i]=-1;
a[i]+=a[i-1];//以a为前缀
if(q[a[i]+m]==0)q[a[i]+m]=i;
}
for(int i=1;i<=n;i++){
// cout<<a[i]<<" ";
// cout<<"\n";
if(a[i]==0)ans=max(ans,i);
else ans=max(ans,i-q[a[i]+m]);
}
cout<<ans;
return 0;
}
```
这个方法是把输入0的数改为-1,当人数均等总值为0
by Delayed @ 2024-08-08 17:26:52
$a,b$ 分别表示男女的数量,$t$ 就是男女数量之差(或者是前缀和),然后用桶记录一下 $t$
最先出现和最后出现的位置,序列的长度就是答案。
但现在问题在于,$t$ 有可能小于 $0$。负数肯定不能作数组下标,因此将 $t \leftarrow t+n$,这样就可以避免出界。 @[DANXIBAO_Hhh](/user/681893)
by InfiniteRobin @ 2024-08-08 17:28:07
>序列的长度就是答案
这里说错了,是最先出现和最后出现的位置之差,即为 $r_{t} - l_{t}$。
by InfiniteRobin @ 2024-08-08 17:30:34
@[Delayed](/user/1244320) 感谢大佬
by DANXIBAO_Hhh @ 2024-08-08 17:47:32
@[InfiniteRobin](/user/1068165) 感谢大佬
by DANXIBAO_Hhh @ 2024-08-08 17:47:49