LGP1114 “非常男女”计划 学习笔记

LGP1114 “非常男女”计划 学习笔记

Luogu Link

题意简述

给定一个长为 \(n\)\(\texttt{01}\) 序列。需要找出一个区间满足其中 \(\texttt{0}\)\(\texttt{1}\) 数量相等,问这个区间最长可以有多长。

\(n\le 10^5\)

做法解析

你记录每个前缀中两种码出现次数的差值,如果有两个下标满足其值相同,说明其间两种码的出现次数相同。原理就这,接下来的不需要我赘述了吧。

代码实现

#include <bits/stdc++.h>
using namespace std;
using namespace obasic;
const int MaxN=1e5+5;
int N,A[MaxN],csum,Vp=1e5,ans;
vector<int> buc[MaxN<<1];
int main(){
    readi(N);buc[Vp].push_back(0);
    for(int i=1;i<=N;i++)readi(A[i]),csum+=(A[i]?1:-1),buc[csum+Vp].push_back(i);
    for(int i=0;i<=Vp*2;i++){
        int csiz=buc[i].size();
        if(csiz)maxxer(ans,buc[i][csiz-1]-buc[i][0]);
    }
    writi(ans);
    return 0;
}

反思总结

某种意义上这也是一种和哈希思想,此事在CSP那道消消乐里亦有记载。

posted @ 2025-07-07 15:46  矞龙OrinLoong  阅读(55)  评论(0)    收藏  举报