当前位置: 首页 > news >正文

【Codeforces】 CF1870E Another MEX Problem

题目链接

CF方向
Luogu方向

题目解法

解法1
考虑优化 d p dp dp 转移次数,即只转移有用的区间
不难发现, m e x ( l , r ) = m e x ( l + 1 , r ) mex(l,r)=mex(l+1,r) mex(l,r)=mex(l+1,r) m e x ( l , r ) = m e x ( l , r − 1 ) mex(l,r)=mex(l,r-1) mex(l,r)=mex(l,r1),那么区间 [ l , r ] [l,r] [l,r] 就没用
考虑证明剩下有用的区间个数是 O ( n ) O(n) O(n)
[ l , r ] [l,r] [l,r] 是有用的,我们不妨令 a l > a r a_l>a_r al>ar
如果有 R > r R>r R>r 且满足 [ l , R ] [l,R] [l,R] 是有用的,且 a l > a R a_l>a_R al>aR
根据上面的定义, m e x ( l , r ) > a l mex(l,r)>a_l mex(l,r)>al,不然可以踢掉 l l l,所以 a R < m e x ( l , r ) a_R<mex(l,r) aR<mex(l,r),那么 r r r 就没有加的必要
所以对于 a l > a r a_l>a_r al>ar,有用的 r r r 只有一个
对于 a l < a r a_l<a_r al<ar 同理, a l = a r a_l=a_r al=ar 随便删去 l , r l,r l,r 都比 [ l , r ] [l,r] [l,r]
所以剩余的区间个数是 2 n 2n 2n
直接 d p dp dp 即可

#include <bits/stdc++.h>
#define pb push_back
using namespace std;
const int N=5100;
int mex[N][N],cnt[N],a[N];
bool ok[N][N<<1];
vector<int> trans[N];
inline int read(){int FF=0,RR=1;char ch=getchar();for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;return FF*RR;
}
void work(){int n=read();for(int i=1;i<=n;i++) a[i]=read();for(int i=1;i<=n;i++){int curmex=0;for(int j=i;j<=n;j++){cnt[a[j]]++;while(cnt[curmex]) curmex++;mex[i][j]=curmex;}for(int j=0;j<=n;j++) cnt[j]=0;}for(int i=1;i<=n;i++) for(int j=i;j<=n;j++) if(mex[i][j]!=mex[i+1][j]&&mex[i][j]!=mex[i][j-1]) trans[j].pb(i);ok[0][0]=1;for(int i=1;i<=n;i++){for(int j=0;j<=n<<1;j++) ok[i][j]=ok[i-1][j];for(int j:trans[i]) for(int k=0;k<=n<<1;k++) if(ok[j-1][k]) ok[i][k^mex[j][i]]=1;}for(int i=n<<1;;i--) if(ok[n][i]){ printf("%d\n",i);break;}for(int i=1;i<=n;i++) trans[i].clear();
}
int main(){int T=read();while(T--) work();fprintf(stderr,"%d ms\n",int(1e3*clock()/CLOCKS_PER_SEC));return 0;
}

解法2
我们发现 m e x mex mex 的上界是 2 n 2n 2n
所以我们考虑 g i g_i gi 表示异或 m e x mex mex 和为 i i i 最少需要的前缀长度
显然 g i g_i gi 可用类似最短路的方式实现
但这样会多一个 l o g log log,因为值域较小,开 n n n v e c t o r vector vector 存最优位置对应的异或 m e x mex mex 值即可

http://www.lryc.cn/news/223095.html

相关文章:

  • 【Objective-C】Objective-C汇总
  • 怎么查找性别为女性的不同学历层次不同学位以及所有人不同职务职称的人数
  • 浅谈Elasticsearch查询和搜索
  • SLAM从入门到精通(被忽视的基础图像处理)
  • 【C++】继承详解
  • react:swr接口缓存
  • 2023-11 | 短视频批量下载/爬取某个用户的所有视频 | Python
  • 【JAVA学习笔记】66 - 本章作业(IO流)
  • vscode中 vue3+ts 项目的提示失效,volar插件失效问题解决方案
  • Elasticsearch:在 ES|QL 中使用 DISSECT 和 GROK 进行数据处理
  • 基于自适应自回归模型的高级人工智能概念及其实现
  • windows的mysql启动错误,查看windows日志
  • centos7部署Canal与Canal集成使用
  • C语言--分段函数--switch语句
  • 动态规划31(Leetcode188买卖股票的最佳时机4)
  • npm包管理相关命令
  • 2023年Q3乳品行业数据分析(乳品市场未来发展趋势)
  • 软考 系统架构设计师系列知识点之边缘计算(2)
  • Maven中的继承与聚合
  • 第三章 UI开发的点点滴滴
  • 637. 二叉树的层平均值
  • 【Java笔试强训】Day9(CM72 另类加法、HJ91 走方格的方案数)
  • django REST框架- Django-ninja
  • 数据结构与算法C语言版学习笔记(3)-线性表的链式结构:链表
  • Web学习笔记-Vue3(环境配置、概念、整体布局设计)
  • 【React-Native开发3D应用】React Native加载GLB格式3D模型并打包至Android手机端
  • python的列表
  • [100天算法】-最短无序连续子数组(day 66)
  • 001. 变量、环境变量
  • 软考软件设计师刷题笔记整理