思路:
考虑差分的思想,男生为+1,女生为-1,做前缀和
一段男女人数相等的序列[l,r]
应该满足sum[r]-sum[l-1]=0
即sum[r]=sum[l-1]
sum的范围在[-n,n]
可以考虑用桶记录出现过的sum最早出现的位置以及最晚出现的位置
Ans =max{lastpos(sum)-first(sum)}
注意sum=0时最早出现的位置就是0
#include <cstdio>
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
struct node {int l, r;} t[N << 1];
int n, a[N], sum[N], ans;
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
if (a[i]) sum[i] = sum[i - 1] + 1;
else sum[i] = sum[i - 1] - 1;
if (!t[sum[i] + n].l) t[sum[i] + n].l = i;
else t[sum[i] + n].r = i;
}
for(int i = 0; i <= 2 * n; i++) ans = max(ans, t[i].r - t[i].l);
printf("%d\n", ans);
return 0;
}