AC代码求问,悬两关

P1114 “非常男女”计划

@[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


|