zhongzihao/Codeforces Round 559 (Div. 1)

Contest Info

practice link

Solutions

A. The Party and Sweets

签到题。

B. The minimal unique substring

签到题。

C. Permutation recovery

签到题。

D. Winding polygonal line

题目大意:给你平面上的 \(n\) 个点,无三点共线。另外给出一个长度为 \(n-2\)LR 串。要求你将这 \(n\) 个点连成一条不自交的折线,使得每次转向时的方向恰为给出的 LR 串。

题解:首先求出凸包,如果第一个方向是 L,就选取逆时针的相邻两点作为前两个点;如果第一个方向是 R,就选取顺时针的相邻两点作为前两个点。可以发现这时无论怎么选取第三个点,第一个方向都一定满足了。之后去掉第一个点,再求一次凸包,以此类推。

时间复杂度 \(\mathcal{O}(n^{2})\)

E. Strange device

题目大意:交互题。有一棵 \(n\leq10^{3}\) 个点的树,你最多询问 \(80\) 次,每次询问要给出序列 \(d_{1},d_{2},\cdots,d_{n}\),交互器会回答你一个长度为 \(n\) 的序列 \(s\),其中 \(s_{i}=1\),当且仅当存在一个 \(j\neq i,dis(i,j)\le d_{j}\),否则为 \(0\)。你需要还原这棵树。

题解:考虑先求出每个点到 \(1\) 的距离。如果询问 \((\frac{n}{2}-1,0,0,\cdots)\)\((\frac{n}{2},0,0,\cdots)\),我们既可以得到距离 \(\le\frac{n}{2}-1\) 的点,也可以得到距离恰为 \(\frac{n}{2}\) 的点。类似地,我们可以对 \(1\) 和所有距离为 \(\frac{n}{2}\) 的点分别询问距离 \(\frac{n}{4}-1\)\(\frac{n}{4}\)。但是我们不能一直这样分开询问,事实上,在下一轮询问中,对于距离 \(0\)\(\frac{2n}{4}\) 的点和距离 \(\frac{n}{4}\)\(\frac{3n}{4}\) 的点,分别可以合并起来询问,以此类推。正确性就不赘述了。这一部分的总次数为 \(4\log n\)

之后我们对每一位 \(i\),将所有 \(i\) 位为 \(1\) 的点置为 \(1\) 来询问,这样我们就可以得到所有邻点中有 \(i\) 这一位的点。如果我们按照深度模 \(3\) 的余数询问 \(3\) 次,就可以保证这个邻点一定是父亲,这样在 \(3\log n\) 次询问中解决了该部分。

F. Density of subarrays

题目大意:本题的字符集为 \(\Sigma=1,2,\cdots,c\)。定义一个串的价值为 \(p\),当且仅当其包含了所有长为 \(p\) 的串作为子序列,但是没有包含所有长为 \(p+1\) 的串。给你一个长为 \(n\) 的串,对于每个 \(p=0,1,\cdots,n\),求出原串价值为 \(p\) 的子序列的数量。

题解:求 \(p\) 比较显然,定义一个好的串为包含所有字符的串,那么我们显然是从左到右贪心,最多能划分出的好的子串数量就是 \(p\)。接下来我们需要用两种方法求答案:

方法一

假设 \(dp[i][j]\) 表示第 \(i\) 个字符恰好是第 \(j\) 个极小好串的最后一个字符的方案数。那么最终答案 \(\ge j\) 的方案数就是 \(\sum_{i=1}^{n}dp[i][j]2^{n-j}\),然后再容斥一下就能得到答案了。

\(dp[i][j]\) 的计算方法为:设 \(trans[i][j]\) 表示 \(i\)\(j\) 中有多少个子序列,恰好在 \(j\) 处变成好的。我们先求出 \(t'[i][j]\),表示 \(i\)\(j\) 中好的子序列数量,那么就是每个字符至少出现一次,也就是说 \(\displaystyle{t'[i][j]=\prod_{ch\in\Sigma}\left(2^{cnt_{i,j,ch}}-1\right)}\)。然后再容斥,即 \(trans[i][j]=t'[i][j]-2t'[i][j-1]\) 即可。\(dp[i][j]=\sum_{k<i}dp[k][j]trans[k+1][j]\)

时间复杂度 \(\mathcal{O}(\frac{n^{3}}{c})\)

方法二

方法二较为简单,设 \(dp[i][j][S]\) 表示到位置 \(i\) 处,已有 \(j\) 个好的子串,不完整的子串的状态为 \(S\) 的方案数。

时间复杂度 \(\mathcal{O}(\frac{n^{2}2^{c}}{c})\)

\(\frac{n^{3}}{c}=\frac{n^{2}2^{c}}{c}\) 时复杂度取最小值,即 \(c=\log n\)。时间复杂度 \(\mathcal{O}(\frac{n^{3}}{\log n})\)。有些卡常,方法一的 \(dp\) 可能需要做一些 cache 上的优化。