U423621 [HDK - NRC] Sqen Paradox 题解
题目描述及
设
处理出来后,分类讨论,找 拿这个维护就 O(n) 了
#include<bits/stdc++.h> inline int read(){ char ch=getchar();int x=0,f=1; for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1; for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<3)+(x<<1)+(ch^48); return x*f; } const int N=1e6+10; int a[N],temp[N],mp[N],n,m,tot,L[N],l=1,st[N][25],c[N]; std::vector<int> t[N]; std::unordered_map<int,int> map; inline int ask(int l,int r){if(l>r)return 0;int k=std::__lg(r-l+1);return std::max(st[l][k],st[r-(1<<k)+1][k]);} int main(){ // freopen("in.in","r",stdin),freopen("out.out","w",stdout); std::ios::sync_with_stdio(false);std::cin.tie(0),std::cout.tie(0); n=read();m=read(); for(int i=1;i<=n;++i){ a[i]=read(); if(!map[a[i]])map[a[i]]=++tot; a[i]=map[a[i]]; mp[a[i]]++; while(mp[a[i]]>1)mp[a[l++]]--; L[i]=l; t[L[i]].push_back(i); } for(int i=1;i<=n;++i)a[i]=i-L[i]+1,st[i][0]=a[i]; for(int k=1;k<=std::__lg(n);++k) for(int i=1;i+(1<<k)-1<=n;++i) st[i][k]=std::max(st[i][k-1],st[i+(1<<k-1)][k-1]); for(int i=1;i<=n;++i){if(!t[i].size())c[i]=c[i-1];else c[i]=i;} for(int i=1;i<=m;++i){ int l=read(),r=read(),res=0; if(l>r)std::swap(l,r); int zc=c[l]; int mid=std::min(t[zc][t[zc].size()-1],r); std::cout<<std::max(mid-l+1,ask(mid+1,r))<<'\n'; } }
特别鸣谢:int_R
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现