用二分不太对应为可能有区间mid两边都有
建议用前缀和
给你看下我的AC code
```
#include<bits/stdc++.h>
using namespace std;
int n,b[100010],g[100010],ans;
bool a[100010];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
if(a[i]==1)
b[i]=b[i-1]+1;
else b[i]=b[i-1];
for(int i=1;i<=n;i++)
if(a[i]==0)
g[i]=g[i-1]+1;
else g[i]=g[i-1];
for(int i=0;i<=n;i++)
{
for(int j=i+ans;j<=n;j++)
if(b[j]-b[i]==g[j]-g[i])
ans=max(ans,j-i);
}
cout<<ans<<endl;
return 0;
}
```
求关
by 玉树临风英俊潇洒 @ 2024-09-16 14:36:43
没必要这么麻烦吧,可以用前缀和二维暴力,长度要尽量长,从长到短暴力枚举遇到的第一个绝对是最长的,输出就可以了
然后就是由于男女需要配对,最多配对2*min(男生数量,女生数量),所以一开始可以不比从N开始
对于玩法配对的情况,只存在于其中一方为0的情况,特判就可以了
```c
#include<bits/stdc++.h>
using namespace std;
int a[100005][2];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
int x;
cin>>x;
a[i][x]++;
a[i][0]+=a[i-1][0];
a[i][1]+=a[i-1][1];
}
if(a[n][0]==0||a[n][1]==0){
cout<<0;
return 0;
}
for(int k=min(a[n][0],a[n][1])*2;k>1;k--){
for(int i=1;i<=n-k+1;i++){
if(a[i+k-1][0]-a[i-1][0]==a[i+k-1][1]-a[i-1][1]){
cout<<k;
return 0;
}
}
}
return 0;
}
```
by imagine_innovate @ 2024-09-16 20:51:35