100求优化,Subtask #1没过

P1114 “非常男女”计划

@[chaizechen_czc](/user/877062) 将 $ 0$ 变为 $-1$ ,然后开桶数组, `buc[i]` 表示第一次和达到 $i$ 的位置,如果下次达到了就取 $\max$ 然后就可以实现 $O(n)$ 记录。 Tip: 实现时,桶开两倍,每次 $+n$ 即可防止负数。
by liuenyin @ 2023-08-29 14:33:02


$谢谢大佬指导$
by chaizechen_czc @ 2023-08-29 16:23:28


``` #include <iostream> #include<cstdio> #include<map> using namespace std; int n,maxn,sum; map<int,int> mp1,mp2; signed main() { cin>>n; mp1[0]=0; mp2[0]=0; for(int i=1;i<=n;++i) { int x; scanf("%d",&x); if(x)++sum; else --sum; mp1.insert(pair<int,int>(sum,i)); mp2[sum]=i; } for(int i=-n;i<=n;++i) maxn=max(mp2[i]-mp1[i],maxn); cout<<maxn; return 0; } ``` 用map也行
by 2672434062xzl @ 2023-09-08 23:08:04


|