Codeforces试题乱做 Part8

搬机房的第一天.


\(\text{[CF1270I]Xor on Figures}\)

\(\color{red}{\text{[HARD]}}\)

为数不多的 \(3500\) 清新题.

观察到这是个二维循环卷积的形式, 考虑矩阵刻画.

重新定义两个 \(2^k\times 2^k\) 的矩阵乘法, \((a\times b)[x][y]=\bigoplus\limits_{i=0}^{2^k-1}{a[i][j]\times b[(x-i)\bmod{2^k}][(y-j)\bmod{2^k}]}\) .

定义矩阵 \(F\) , \(F[x_i][y_i]=1\) , 则我们要找到一个 \(2^k\) 的矩阵 \(C\) , 满足 \(F\times C=A\) , 且 \(C\) 中非 \(0\) 元素个数最少.

我们仅需证明存在逆元且 \(F^{-1}=F^{2^k-1}\) , 我们只需证明 \(F^{2^k}=I\) 即可, 其中 \(I[0][0]=1\) , 其它位置均为 \(0\) .

考虑 \(F^2\) , 只有 \(F[2\times x_i \bmod{2^k}][2\times y_i \bmod{2^k}]\) 有值, 于是 \(F^{2^k}\) 只有 \(F[2^k\times x_i\bmod{2^k}][2^k\times y_i\bmod{2^k}]\) 可能有值.

所以可以得到 \(C=A\times F^{2^k-1}=A\times \prod\limits_{i=0}^{k-1}{F^{2^i}}\) , 时间复杂度 \(\mathcal{O}(4^kt)\) , 其中 \(t\)\(F^{2^i}\)\(1\) 的个数.


\(\text{[CF1109E]Sasha and a Very Easy Test}\)

\(\color{green}{\text{[EASY]}}\)

线段树维护模数的唯一分解因子个数, 板子, 时间复杂度 \(\mathcal{O}(n\log{n})\) .


\(\text{[CF504E]Misha and LCP on Tree}\)

\(\color{green}{\text{[EASY]}}\)

好的, 我学了个假的哈希, 哈希是有可减性的!

对于序列上的问题, 我们可以二分加哈希做到 \(\mathcal{O}(n+m\log{n})\) 的复杂度, 考虑树上的问题, 我们仍可以 \(\mathcal{O}(1)\) 的得到一个路径的哈希值.

具体的说是分别维护根到点的路径的正串反串的哈希值, 在 \(LCA\) 处断开计算即可.

由于要二分 \(LCP\) 长度, 所以要知道每个长度其结尾的位置, 相当于 \(k\) 级祖先, 长剖优化, 时间复杂度 \(\mathcal{O}((n+m)\log{n})\) .

要写双哈希.


\(\text{[CF1609G]A Stroll Around the Matrix}\)

\(\color{green}{\text{[EASY]}}\)

发现最终形式会是个楼梯形, 并且当我们在 \((i,j)\) 时, 我们会往下走, 当且仅当 \(j=m\) 或者 \(a_{i+1}-a_i < b_{j+1}-b_j\) .

考虑设 \(pos_i\) 表示处于第 \(i\) 行时, 走到哪个位置会往下走. 由于 \(n\) 很小, 且 \(a,b\) 下凸, 所以 \(pos\) 也单调不降, 线段树维护即可.

答案为 \(\sum\limits_{i=1}^{n}{a_i(pos_i-pos_{i-1}+1)+\sum\limits_{j=pos_{i-1}}^{pos_i}{b_j}}\) , 时间复杂度 \(\mathcal{O}(nm\log{m})\) .


\(\text{[CF618G]Combining Slimes}\)

\(\color{red}{\text{[HARD]}}\)

套路, 但恶心, 搬运个题解.

发现最终序列一定是对于任意两个相邻的数 \(i,j\) , 要么 \(i=1\) , 要么 \(i>j\) .

考虑期望的线性性, 计算出所有格子的期望, 令 \(a_{i,j}\) 表示 \(1\times i\) 的表格最左边是 \(j\) 的概率, 转移为 \(a_{i,j}=a_{i,j-1}\cdot a_{i-1,j-1}\) .

发现 \(n\) 特别大, 不能都算出来, 但是我们知道在 \(j\) 较大的时候值会趋近于 \(0\) , 将 \(a_{i,j}\) 近似成 \((1-p)^{2^{j-1}}\) , 则 \(j\geqslant 50\) 时基本可以忽略, 令 \(m=50\) .

\(A_{i,j}\) 表示用 \(1\times i\) 的网格且最左边一格为 \(j\) 且它不会被合并的概率, 转移为 \(A_{i,j}=a_{i,j}(1-a_{i-1,j})\) .

\(b_{i,j}\) 表示用 \(1\times i\) 的网格第一次插入的数是 \(2\) , 最左边一格为 \(j\) 的概率, 转移为 \(b_{i,j}=b_{i,j-1}\cdot a_{i-1,j-1}\) .

同理设 \(B_{i,j}\) 为不会被合并的概率, \(B_{i,j}=b_{i,j}(1-a_{i,j})\) .

\(f_{i,j}\) 表示最终序列右 \(i\) 位中最左边的位置是 \(j\) 的情况下这 \(i\) 位的期望和, 转移为

\[f_{i,j}=\begin{cases}j+\frac{\sum\limits_{k=2}^{m}{f_{i-1,k}B_{i-1}}}{\sum\limits_{k=2}^{m}{B_{i-1,k}}} & ,j=1\\j+\frac{\sum\limits_{k=1}^{j-1}{f_{i-1,k}A_{i-1,k}}}{\sum\limits_{k=1}^{j-1}{A_{i-1,k}}}& ,j\not =1\end{cases} \]

最终答案即为 \(\sum\limits_{j=1}^{m}{A_{n,j}f_{n,j}}\) , 若 \(n\leqslant m\) 则暴力计算, 对于 \(i\geqslant m\) , \(A_{i,j}\approx A_{m,j}\) , 所以答案为 \(\sum\limits_{j=1}^{m}{A_{m,j}f_{n,j}}\) .

考虑矩阵快速幂优化, 时间复杂度 \(\mathcal{O}(m^3\log{n})\) .


\(\text{[CF505E]Mr. Kitayuta vs. Bamboos}\)

\(\color{green}{\text{[EASY]}}\)

和新年的腮雷差不多, 都是二分答案逆向思维, 二分变成可行性问题, 再从每个竹子都是 \(mid\) 出发逆着做, 保证过程中所有的竹子不会到负数, 最后判断是否所有高度都大于等于 \(h_i\) 即可.

时间复杂度 \(\mathcal{O}((n+mk)\log{V}\log{n})\) .


\(\text{[CF1553F]Pairwise Modulo}\)

\(\color{green}{\text{[EASY]}}\)

首先有 \(p_i=p_{i-1}+\sum\limits_{j=1}^{i-1}{(a_j\bmod{a_i})+(a_i\bmod{a_j})}\) , 前面一部分是 \(a_j\bmod{a_i}=a_j-ka_i\) , 后面一部分是 \(a_i\bmod{a_j}=\lfloor\frac{a_i}{a_j}\rfloor a_j\) .

时间复杂度 \(\mathcal{O}(n\ln{n}\log{m})\) .


\(\text{[CF1396E]Distance Matching}\)

\(\color{blue}{\text{[NORMAL]}}\)

还是没有那么难的, 当然最后的构造还是没有那么容易想到的.

构造可行解使得权值恰好为某一值的题, 一般思路是构造出最大和最小值, 然后从某个极值修改逼近.

考虑一条边对答案的贡献, 若 \(E(x,y)\) 把树分成 \(X\)\(Y\) 两棵子树, 那么该边最大贡献为 \(\min\{siz_X,siz_Y\}\) , 最小贡献为 \(siz_X\bmod{2}\) .

由于 \(\min\) 不是很好处理, 考虑用个办法把它弄掉, 发现取重心即可.

\[Minanswer=\sum_{i=1}^{n}{[i \not= root]siz_i\bmod{2}}\\ Maxanswer=\sum_{i=1}^{n}{[i \not= root]siz_i} \]

先给出结论, 有解的充要条件是 \(Minanswer \leqslant k \leqslant Maxanswer\) , 并且 \(Maxanswer \equiv k\pmod{2}\) .

充分性证明, 通过构造方法证.

每次在 \(siz\) 最大的子树中选两个 \(lca\) 深度最大的点, 本来它们是向外连的, 现在变成自己相互连, 所以 \(\Delta=2dep_{lca}\) , 然后删掉那两个点.

不难证明这样构造一定能从 \(Maxanswer\) 变成 \(Minanswer\) , 因为点数 \(n\) 始终为偶数, 所以从最大子树里删两个点后不会使得次大子树大于 \(\frac{n}{2}\) , 上面求 \(Maxanswer\)\(Minanswer\) 的方法始终成立.

在最后一次 \(2dep_{lca}>k\) 时, 因为 \(dep\) 连续, 所以肯定能构造出恰好使得 \(k=0\) 的方案.

剩下的点按 \(Maxanswer\) 的方案跨子树连即可.

必要性, 因为 \(\Delta\) 是偶数所以 \(k\)\(Maxanswer\) 奇偶性不同则无解.

时间复杂度 \(\mathcal{O}(n\log{n})\) .


\(\text{[CF1736C2]Good Subarrays (Hard Version)}\)

\(\color{green}{\text{[EASY]}}\)

为什么有种越活越回去的感觉呢.

考虑维护数组 \(b_i=\max\{i-a_i+1,1\}\) , 表示只考虑 \(a_i\) 的情况下最远的左端点, 那么对于位置 \(i\) , 它最远的左端点显然是 \(\max\limits_{j=1}^{i}\{b_j\}\) , 记为 \(c_i\) , 答案即为 \(\frac{n(n+1)}{2}+n-\sum\limits_{i=1}^{n}{c_i}\) , 考虑用线段树维护 \(c_i\) , 时间复杂度 \(\mathcal{O}(n\log^{2}{n})\) .


\(\text{[CF1736D]Equal Binary Subsequences}\)

\(\color{green}{\text{[EASY]}}\)

首先有显然的必要条件是 \(0\)\(1\) 的数量都得是偶数, 其实这也是必要条件, 考虑这样一种构造.

我们让 \(s_{i}\)\(s_{i+1}\) 配对, 假设有 \(x\) 个对 \(s_i\)\(s_{i+1}\) 是不同的, 那么有 \(n-x\) 个对是相同的, 其中 \(x\) 一定为偶数, 给出简要证明, 设在 \(n-x\) 对相同的中有 \(y\)\(s_i\)\(s_{i+1}\) 均为 \(1\) , 那么 \(1\) 的总数为 \(x+2y\) , 因为 \(1\) 的个数总为偶数, 故 \(x\) 为偶数.

现在我们的基础想法是让两个序列, 一个选 \(s_{i}\) 另一个选 \(s_{i+1}\) , 所以我们需要用给出的操作让那 \(x\) 对也符合条件, 这是容易办到的.

我们仅需在这 \(x\) 对中交替的选出 \(01\) 即可, 例如我们有 \((s_{i}=1,s_{i+1}=0),(s_{j}=0,s_{j+1}=1),(s_{k}=0,s_{k+1}=1),(s_{l}=0,s_{l+1}=1)\) , 那么我们仅需操作下标 \(i+1,j+1,k,l+1\) 即可, 这样轮换之后一定可以满足 \(s_{i}=s_{i+1}\) .

最后取所有奇数即可, 时间复杂度 \(\mathcal{O}(n)\) .


我不好说, 为什么有点越活越回去了, 总能被莫名其妙的题莫名其妙的杀掉, 然后就莫名其妙的被搞到心态, 真莫名其妙, 哈哈看淡 \(rating\) 就没事了. /kx

posted @ 2022-10-16 10:09  Lonely923  阅读(39)  评论(0编辑  收藏  举报