CF1446D2 Frequency Problem - 数据结构
题意
给定正整数数列
题解
来自 lxl 的
定义一个区间是合法的,当且仅当其中有至少两种出现次数最多的数。
首先,找到全局的众数
我们枚举一个
我们将
例如,对于 mxxmm
这个序列,我们会让第一个
这样每个
复杂度
代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;
#define For(Ti,Ta,Tb) for(int Ti=(Ta);Ti<=(Tb);++Ti)
#define Dec(Ti,Ta,Tb) for(int Ti=(Ta);Ti>=(Tb);--Ti)
#define Debug(...) fprintf(stderr,__VA_ARGS__)
typedef long long ll;
const int N=2e5+5;
int n,a[N],cnt[N];
vector<int> occ[N];
struct Point{int p,v;};
bool operator<(const Point &p1,const Point &p2){
return p1.p<p2.p;
}
bool operator==(const Point &p1,const Point &p2){
return p1.p==p2.p&&p1.v==p2.v;
}
bool Between(int mode,int x,int y){
auto it=upper_bound(occ[mode].begin(),occ[mode].end(),x);
return it!=occ[mode].end()&&*it<y;
}
int val[N*2],tot,tm[N*2];
int main(){
ios::sync_with_stdio(false),cin.tie(nullptr);
cin>>n;
For(i,1,n){
cin>>a[i];
++cnt[a[i]],occ[a[i]].push_back(i);
}
int mode=max_element(cnt+1,cnt+n+1)-cnt,ans=0;
set<int> st(occ[mode].begin(),occ[mode].end());
vector<int> del;
For(x,1,n){
if(x==mode||!cnt[x]) continue;
for(int i:del) st.insert(i);
del.clear();
vector<Point> tg;
for(int i:occ[x]){
auto it=st.upper_bound(i);
if(it!=st.end()) tg.push_back({*it,-1}),del.push_back(*it),st.erase(it);
tg.push_back({i,1});
}
for(int i=occ[x].size()-1;i>=0;--i){
auto it=st.lower_bound(occ[x][i]);
if(it!=st.begin()) tg.push_back({*--it,-1}),del.push_back(*it),st.erase(it);
}
sort(tg.begin(),tg.end());
tg.erase(unique(tg.begin(),tg.end()),tg.end());
for(auto i=tg.begin();i!=tg.end();++i){
auto l=i;
for(;next(i)!=tg.end()&&!Between(mode,i->p,next(i)->p);++i);
int lim,rim;
auto it=lower_bound(occ[mode].begin(),occ[mode].end(),l->p),itr=upper_bound(occ[mode].begin(),occ[mode].end(),i->p);
if(it==occ[mode].begin()) lim=0;
else lim=*--it;
if(itr==occ[mode].end()) rim=n;
else rim=*itr-1;
++tot,val[0+n]=lim,tm[0+n]=tot;
int cur=0;
for(auto j=l;j<=i;++j){
cur+=j->v;
if(tm[cur+n]==tot) ans=max(ans,(j==i?rim:next(j)->p-1)-val[cur+n]);
else val[cur+n]=j->p,tm[cur+n]=tot;
}
}
}
cout<<ans<<'\n';
return 0;
}
作者:alan-zhao-2007
出处:https://www.cnblogs.com/alan-zhao-2007/p/cf1446d2-sol.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
Written by Alan_Zhao
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具