Codeforces 做题记录

CF1753C. Wish I Knew How to Sort

首先设原序列包含 m0 ,并且初始状态中前 m 个位置中有 k0

考虑 DP ,设 f[i] 表示前 m 个位置中有 i1 的期望操作次数。

转移较为容易:

fi=pfi+1+(1p)fi+1

其中 p=2(ni)2n(n1)

CF1744F. MEX vs MED

我们从 0 开始从小到大加数,维护恰好包含了 0i 这些数的区间 [L,.R]。此时包含我们维护的这个区间的区间的 mex 一定大于 i

我们想要让 med<=i ,那么区间长度 len<=2(i+1) 。我们计算出有多少个长度为 2(i+1)2i+1 的区间包含[L,R]

这样显然是不重不漏的。

CF1748D. ConstructOR

转化一下题目:我们要找到一个 d 的倍数,满足其在二进制表示下包含 a|b

这题有这么一条关键的性质:

  • xy 的倍数,那么一定满足 lowbit(x)>=lowbit(y)

这样我们考虑无解的情况,如果 min(lowbit(a),lowbit(b))<lowbit(d)

否则的话我们有一种构造方案,满足一定有解。

记当前处理出来的答案为 res 我们从低位到高位考虑,记 lowbit(d)=x 如果 resi 位等于 0a|bi 位不等于 0 ,我们就让 res+=d<<(i-x)

这样的话最坏情况下,沟造出来的数为 1+2d+d22+...+d229 ,由于 d<230 ,所以构造出来的 res<=260

CF1748E. Yet Another Array Counting Problem

不难发现,我们需要让 b 序列的相对大小关系与 a 序列相等。由于 nm106 ,我们将原树建笛卡尔树,对于每个节点,我们令 fi,j 表示在 i 结点填 j 的方案数。转移如下:

fi,j=k=1j1fls,kt=1jfrs,t

状态数最多只有 106 ,直接记忆化搜索就能过。

CF1743F. Intersection and Union

对于本题,直接计算每一种情况的贡献非常困难,因此我们考虑:拆贡献 。我们单独计算出每一个数会存在于最终答案的方案数,然后求和即可。

对于每一个数 x ,我们设计 DP ,设 f[i][0/1] 表示已经完成了前 i 次操作,x 这个数是否剩下的方案数。

考虑转移,对于第 i 个区间包含 x 和不包含 x 分开考虑。

  1. 包含

fi,0=fi1,0+fi1,1

fi,1=2fi1,0+2fi1,1

  1. 不包含

fi,0=3fi1,0+fi1,1

fi,1=2fi1,1

对于这种 fi 的状态仅与 fi1 有关,且系数较为好处理的,我们可以考虑 ddp

我们把转移方程写成系数的形式:

[fi,0fi,1]=[1122][fi1,0fi1,1]

[fi,0fi,1]=[3102][fi1,0fi1,1]

线段树维护一下,对于每个区间是否包含就是单点修。

posted @   _YangZJ  阅读(57)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
主题色彩