Loading

Codeforces 做题记录

CF1753C. Wish I Knew How to Sort

首先设原序列包含 \(m\)\(0\) ,并且初始状态中前 \(m\) 个位置中有 \(k\)\(0\)

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

转移较为容易:

\[f_i=p\cdot f_{i+1}+(1-p)\cdot f_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\) 的方案数。转移如下:

\[f_{i,j}=\sum_{k=1}^{j-1}f_{ls,k}\cdot \sum_{t=1}^j f_{rs,t} \]

状态数最多只有 \(10^6\) ,直接记忆化搜索就能过。

CF1743F. Intersection and Union

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

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

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

  1. 包含

\[f_{i,0}=f_{i-1,0}+f_{i-1,1} \]

\[f_{i,1}=2f_{i-1,0}+2f_{i-1,1} \]

  1. 不包含

\[f_{i,0}=3f_{i-1,0}+f_{i-1,1} \]

\[f_{i,1}=2f_{i-1,1} \]

对于这种 \(f_i\) 的状态仅与 \(f_{i-1}\) 有关,且系数较为好处理的,我们可以考虑 \(ddp\)

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

\[\begin{bmatrix} f_{i,0} \\ f_{i,1} \end{bmatrix} = \begin{bmatrix} 1&1\\ 2&2 \end{bmatrix} \cdot \begin{bmatrix} f_{i-1,0} \\ f_{i-1,1} \end{bmatrix} \]

\[\begin{bmatrix} f_{i,0}\\ f_{i,1} \end{bmatrix} =\begin{bmatrix} 3&1\\ 0&2 \end{bmatrix} \cdot \begin{bmatrix} f_{i-1,0}\\ f_{i-1,1} \end{bmatrix} \]

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

posted @ 2022-11-14 21:29  _YangZJ  阅读(62)  评论(1)    收藏  举报