Codeforces Round 958 (Div. 2) VP记录 (A~D)
vp只切了ABC,D想假了,还是太菜。
A
\([{\color{green} ▲ }]\) 签到
考虑每次都分出 \((k-1)\) 个 \(1\),同时 \(n\) 减去 \((k-1)\),每次元素个数的最大增量是 \((k-1)\),所以该构造是最佳策略。
B
\([{\color{green} ▲ }]\) 结论
只要某个时间点 \(c1 > c0\),整个序列就可以变换为 \([1]\),发现 \(0\) 和 \(1\) 的个数在操作后是单调不增的,尽可能减少 \(0\)的个数,将一段连续的 \(0\) 变为一个 \(0\),最后判断 \(c1 > c0\) 即可。
C
\([{\color{green} ▲ }]\) 二进制(码了很久)
顺序不好构造,第一个数难确定,考虑倒序构造,根据 \(a_{i+1}\) 构造 \(a_i\)。
最后一项一定是 \(n\),记 \(n\) 中从高到低各二进制位为 \(2 ^ k_0, 2 ^ k_1 \ldots(k_0 > k_1 > ⋯)\),则一种显然的构造是:
D
\([{\color{red} \times }]\) 树形DP
假设总共 \(L\) 回合结束,设怪物 \(i\) 在 $b_i(\(1 \le b_i \le L\))$ 回合被杀死,满足相邻两个节点 \(b_i\) 不同,,最小化:
可以简单想到 \(O(n L^2)\) 的树形dp,设 \(f_{u,i}\) 表示节点 \(u\) 在第 \(i\) 回合被杀死,以 \(u\) 为根的子树价值之和的最小值,初始化 \(f_{u,0}=0\),则有转移:
答案即为:
转移的时候前缀最值优化一下可以变成 \(O(nL)\)。
可以证明 \(L \le \lfloor \log_2{n} \rfloor + 1\),证明详见官方题解:https://codeforces.com/blog/entry/131567/

浙公网安备 33010602011771号