Codeforces 做题记录
CF1753C. Wish I Knew How to Sort
首先设原序列包含 \(m\) 个 \(0\) ,并且初始状态中前 \(m\) 个位置中有 \(k\) 个 \(0\) 。
考虑 \(DP\) ,设 \(f[i]\) 表示前 \(m\) 个位置中有 \(i\) 个 \(1\) 的期望操作次数。
转移较为容易:
其中 \(p=\frac{2(n-i)^2}{n(n-1)}\) 。
CF1744F. MEX vs MED
我们从 \(0\) 开始从小到大加数,维护恰好包含了 \(0-i\) 这些数的区间 \([L,.R]\)。此时包含我们维护的这个区间的区间的 \(mex\) 一定大于 \(i\) 。
我们想要让 \(med<=i\) ,那么区间长度 \(len<=2(i+1)\) 。我们计算出有多少个长度为 \(2(i+1)\) 和 \(2i+1\) 的区间包含\([L,R]\) 。
这样显然是不重不漏的。
CF1748D. ConstructOR
转化一下题目:我们要找到一个 \(d\) 的倍数,满足其在二进制表示下包含 \(a |b\) 。
这题有这么一条关键的性质:
- 令 \(x\) 是 \(y\) 的倍数,那么一定满足 \(lowbit(x)>=lowbit(y)\)
这样我们考虑无解的情况,如果 \(min(lowbit(a),lowbit(b))<lowbit(d)\) 。
否则的话我们有一种构造方案,满足一定有解。
记当前处理出来的答案为 \(res\) 我们从低位到高位考虑,记 \(lowbit(d)=x\) 如果 \(res\) 第 \(i\) 位等于 \(0\) ,\(a|b\) 第 \(i\) 位不等于 \(0\) ,我们就让 res+=d<<(i-x)
。
这样的话最坏情况下,沟造出来的数为 \(1+2d+d\cdot 2^2+...+d\cdot 2^{29}\) ,由于 \(d<2^{30}\) ,所以构造出来的 \(res<=2^{60}\) 。
CF1748E. Yet Another Array Counting Problem
不难发现,我们需要让 \(b\) 序列的相对大小关系与 \(a\) 序列相等。由于 \(\sum n\cdot m \leq 10^6\) ,我们将原树建笛卡尔树,对于每个节点,我们令 \(f_{i,j}\) 表示在 \(i\) 结点填 \(j\) 的方案数。转移如下:
状态数最多只有 \(10^6\) ,直接记忆化搜索就能过。
CF1743F. Intersection and Union
对于本题,直接计算每一种情况的贡献非常困难,因此我们考虑:拆贡献 。我们单独计算出每一个数会存在于最终答案的方案数,然后求和即可。
对于每一个数 \(x\) ,我们设计 \(DP\) ,设 \(f[i][0/1]\) 表示已经完成了前 \(i\) 次操作,\(x\) 这个数是否剩下的方案数。
考虑转移,对于第 \(i\) 个区间包含 \(x\) 和不包含 \(x\) 分开考虑。
- 包含
- 不包含
对于这种 \(f_i\) 的状态仅与 \(f_{i-1}\) 有关,且系数较为好处理的,我们可以考虑 \(ddp\) 。
我们把转移方程写成系数的形式:
线段树维护一下,对于每个区间是否包含就是单点修。