CF2200版刷计划(1)
仅记录我 首A 的题的思路的题解……
\(M\). 1407D Discrete Centrifugal Jumps
\(dp_i\) 表示从 \(1\) 楼到 \(i\) 楼要跳几次。
题目中 \(3\) 个条件, 对三个条件分别设 \(dp\) 方程。
第一个很显然, 就是 \(dp_i=dp_{i-1}+1\)。
第二个怎么办?考虑看有哪些点是可能来更新这个点的。
假设 \(x\) 位置可以来更新 \(i\) 位置。那么 \(h_x\) 大于 \(h_{x+1}\) 到 \(h_{i-1}\) 中的最大值。
考虑使用严格递增的单调栈,这样 \(x\) 就一定是单调栈中的节点了
因为要求 \(h_i\) 大于 \(h_{x+1}\) 到 \(h_{i-1}\) 中的最大值,所以如果单调栈中 \(j\) 比 \(i\) 大,那么 \(j\) 之后的节点就不能更新 \(i\) 了。
那么我们就可以在单调栈中弹点更新答案。
第三个条件和第二个一样,不写了。
\(O\). 13C Sequence
\(dp_{i,j}\) 表示前 \(i\) 个数不大于第 \(j\) 个 并且满足不递减的关系的最少步数。
因为是不大于 \(j\),所以 \(dp_{i,j}\) 可以继承上一个或改变第 \(j\) 个数。
即 \(dp_{i,j}=\min(dp_{i,j-1},dp_{i-1,j}+|a_i-a_j|)\)。
\(W\). 1474D Cleaning
首先考虑没有超能力,可以发现消除一定是从两端开始,以此类推。
我们可以发现在消除 \(a_i\) 和 \(a_{i+1}\) 时,如果 \(a_i>a_{i+1}\) ,则无法再消除。
我们可以用 \(L_i\) 和 \(R_i\) 来表示在第i堆石头从左边开始消除时,剩下 \(L_i\) 个石头;从右边开始消除时,剩下 \(R_i\) 个石头。
那么只要有一个i满足 \(L_i=R_{i+1}\) 时,这n堆石头是可消除的。
接下来看超能力,遍历n-1种情况,假设 \(a_i\) 和 \(a_{i+1}\) 交换次序
那么根据前面的结论,只要 \(L_{i−1}\)、\(a_i\)、\(a_{i+1}\)、\(R_{i+2}\) 满足可以消除即可,我们可以直接去暴力判断其是否满足。
最后只要特判在两端的交换以及 \(n=1\) 的情况即可。
\(Y\). 903D Almost Difference
先不考虑第二种情况,那么对于第 \(i\) 个数 ,就会作为 \(x\) \((n-i)\) 次,作为 \(y\) \((i-1)\) 次。
所以答案就是 \(Σ(i-1)a_i-Σ(n-i)a_i\)。
然后对 \(|x-y|\le1\) 特殊处理,此时对应原本的 \(d(a_{i-1},a_i)=1\),\(d(a_{i+1},a_i)=-1\)。
我们就记录到当前 \(i\) 的时候,\(a_{i-1}\) 和 \(a_{i+1}\) 出现的次数,然后对应 \(-1\) 和 \(+1\) 即可。
\(Z\). 7D Palindrome Degree
\(dp_i\) 表示第 \(i\) 个前缀的阶级,显然 \(dp_i=dp_{⌊\frac{i}{2}⌋} +1,ans=∑_{i=1}^n dp_i\)。
我们可以用 hash 来做,算出每一个前缀从前往后的哈希,同理也可以算出从后往前的哈希,相等时转移即可。
\(AD\). 1470D Strange Housing
BFS+染色。
就是如果给的图不连通那就是 \(NO\),否则就是 \(YES\)。
染色方案就是模版的 BFS 层层染色,保证不相邻的点都尽量被标记即可。
\(AE\). 1428E Carrots for Rabbits
首先分 \(1\) 个萝卜,肯定是平均分最优。
其次,把 \(1\) 个萝卜分成 \(i\) 段吃的总时间一定比分成 \(i+1\) 段的时间要长。
所以用一个优先队列存 \(1\) 个萝卜已经被分成了几段和多分出一段带来的收益。
贪心思想,每次都优先选择一次操作带来利益最大的那个,也就是队首。
这样重复 \(k-n\) 次,答案就出来了。

浙公网安备 33010602011771号