CF1870E Another MEX Problem 题解
CF1870E Another MEX Problem 题解
萌新啃了一晚上的官方题解,求管理大大给过/kel
题意#
给你一个序列
思路#
考虑 dp。
首先这个东西是异或,不好做最优化 dp。于是我们考虑可行性 dp。
设
考虑这个东西怎么转移。我们枚举
显然,这样的复杂度是
我们定义一个东西,叫做好的区间。对于一个区间
有一个结论,就是好区间只有
假设我们现在有一个好区间
显然有
我们假设有一个
这样可能吗?不可能。因为
所以我们就证明了,对于每个
同时,这也说明了,对于每个
而且,如果
综上,好的区间最多只有
那么,我们怎么求出所有好的区间呢?
根据上面的定义,我们对于每个
这样,我们就不用枚举所有区间了,只要枚举好的区间就行了,复杂度
代码#
#include<bits/stdc++.h>
#define Pi pair<int,int>
using namespace std;
inline int read(){
int ans=0;bool op=0;char ch=getchar();
while(ch<'0'||'9'<ch){if(ch=='-')op=1;ch=getchar();}
while('0'<=ch&&ch<='9'){ans=(ans<<1)+(ans<<3)+(ch^48);ch=getchar();}
if(op)return -ans;
return ans;
}
const int maxn=5010;
int n;
int a[maxn];
int buc[maxn],mex;
vector<Pi>g[maxn];
bool dp[maxn][maxn<<1];
void solve(){
//read
n=read();
for(int i=1;i<=n;i++)a[i]=read();
//clear
for(int i=1;i<=n;i++)g[i].clear();
//init
for(int i=1;i<=n;i++)if(!a[i])g[i].push_back(make_pair(i,1));//特殊处理0
for(int i=1;i<=n;i++){//i是左端点
memset(buc,0,sizeof(int)*(n+5)),mex=0;
for(int j=i;j<=n;j++){
buc[a[j]]=1;
while(buc[mex])++mex;
if(mex>a[i]&&a[j]<a[i]){
g[j].push_back(make_pair(i,mex));
break;
}
}
}
for(int i=1;i<=n;i++){
memset(buc,0,sizeof(int)*(n+5)),mex=0;
for(int j=i;j>=1;j--){//i是右端点
buc[a[j]]=1;
while(buc[mex])++mex;
if(mex>a[i]&&a[j]<a[i]){
g[i].push_back(make_pair(j,mex));
break;
}
}
}
//solve
memset(dp[0],0,sizeof(bool)*((n<<1)+5));
dp[0][0]=1;
for(int i=1;i<=n;i++){
memcpy(dp[i],dp[i-1],sizeof(bool)*((n<<1)+5));
for(Pi j:g[i]){
for(int k=0;k<=(n<<1);k++){
if((k^j.second)<=(n<<1))dp[i][k]|=dp[j.first-1][k^j.second];
}
}
}
for(int i=(n<<1);i>=0;i--){
if(dp[n][i]){
cout<<i<<'\n';
return;
}
}
}
signed main(){//多组数据
int T=read();
while(T--)solve();
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现