CF573 合集
云落碎碎念
- 题面翻译取自 luogu,本蒟蒻也会安置原题链接
- 不保证文章中不出现“显然”或者“注意到”,可能会出现“易证”
- 有写错的地方欢迎各位神犇指正
前言
只有阳光洒在身上的时候,我才发觉冬天那刻骨铭心的寒。
动态规划 or 找性质专场。
CF573A
题解
简单数论题,给每个数刨去 \(2,3\) 的质因子,对剩下的部分判等。
时间复杂度上是没有问题的,不需要分解质因数,直接试除法就能行,单次 \(/2\),所以每个数 \(\log\) 次。
细节处理
感觉上没什么细节。
CF573B
题解
我真是服了,被 DP 题暴打了,结果一看,是个黄题……
一开始想歪了,上去就是一套二分答案,然后不可做,死活没想到 DP 可以转移。
记 \(f_i\) 表示 \(i\) 这根柱子被摧毁的最小时间,有转移:
然后我就卡在这里了,根本不知道这个东西怎么去转移。
后来说可以正着扫一遍,再倒着扫一遍,给我看傻了……
实际上可以这么去理解,记 \(l_i\) 表示只考虑 \(1 \to i\) 的摧毁顺序,\(i\) 的摧毁时间;\(r_i\) 表示只考虑 \(n \to i\) 的摧毁顺序,\(i\) 的摧毁时间。
显然有 \(f_i = \min(l_i,r_i)\)。前面的 \(l_i,r_i\) 都是好转移的,所以直接做做完了。
细节处理
注意一下 \(+1/-1\) 的边界,建议 1-index,否则容易出现下标越界。
CF573C
题解
难点和关键点非常明确,就是对条件进行充要转化。
记 \(P_1\) 为所有度数 \(\le 2\) 的点构成的集合,\(P_2\) 为所有度数 \(=3\) 的点构成的集合,\(P_3\) 为所有度数 \(\ge 4\) 的点构成的集合。
给出的树合法,当且仅当——
存在一条链 \(s\) 覆盖点集 \(P_3\),且链 \(s\) 的邻域覆盖点集 \(P_2\)。
啧,如果这个结论是对的,可以直接先把这条链抓出来(抓不出来就不合法),然后扩展链的两个端点,判一下邻域就好了。
接下来证明这个结论是等价转化。
充分性
构造方式显然:把 \(s\) 丢到第一行,把 \(P_2\) 的所有点丢到第二行,剩下的按着编号补齐就行。
大概长成这样子……

必要性
对于存在链 \(s\) 覆盖 \(P_2\) 这一条件,可以考虑反证法。
假设存在链 \(s\) 不覆盖 \(P_2\) 可以满足条件,则一定有结点 \(u \in P_2\) 与其它结点不在同一行。然后会出现类似下图的东西,就寄了。故假设不成立,结论得证。

对于邻域覆盖 \(P_1\) 这一条件,和上面条件类似,反证法之后也会出现下图状物,所以假设不成立。

既然是充要条件,那么就可以直接构造这样的结构,构造不出来就不合法。
细节处理
没写代码,不过感觉代码也就是简单 DFS 练习题。
CF573D
题解
并非难题,有人直接 \(O(nQ)\) 的 DP 草过。
如果没有不能骑自己的马的限制,显然是一个图匹配的形式,经典排序后小连小,大连大。
然后你考虑不能骑自己的马,可以猜测就是在上面的基础上进行一点小调整。
啧这个小交换就是自己及其周边进行一个轮换,根据经验,这个轮换的大小不会超过 \(3\)。
然后你就可以写出一个 \(O(n)\) 的 DP 转移,但问题是还有 \(Q\) 组多测。
考虑把转移刻画成矩阵的形式,直接 DDP 维护即可。
时间复杂度 \(O(n \log n \times c^3)\),其中 \(c=3\)。
细节处理
全在线段树的 modify 上,但也没什么办法,只能硬调。记得开 long long。
CF573E
题解
好题。
像我这样的蒟蒻,也可以做到一眼 \(O(n^2)\) DP,然后就没有下文了。
朴素 DP 转移如下:
根据题解区,各路神仙直接开始证明,观测到上述两种转移是存在一个分界点 \(k\) 的。看的我老眼昏花,欲生欲死的。
当 \(i\) 固定的时候,对于 \(j \in [1,k-1]\),\(f_{i,j}\) 都用 \(f_{i-1,j-1}\) 去转移,而对于 \(j \in [k,i]\),\(f_{i,j}\) 都用 \(f_{i-1,j-1}+a_i \times j\) 去转移。
可能这道题目给我的启示并非是花里胡哨的证明,而应该是对这种 DP,有全新的优化思路。对于一种结构相当固定的 DP 来说(且无法用熟知的优化方式去降复杂度),不妨打表,对转移点进行一个刻画。
现在假设我们已通过打表获得了和题解区类似的结论,考虑优化。
你发现 \(i\) 这一维度可以直接丢掉,显然是先二分出 \(k\),然后上数据结构维护 \(f\) 数组。
显然 \([1,k-1]\) 的部分都不用变,而 \([k+1,i]\) 的部分由原来的 \([k,i-1]\) 转移而来,相当于后缀加等差数列,是好做的。然后你发现多了一个现在的 \(k\),有之前的 \(k-1\) 转移过来,相当于单点插入。
问题转化为需要一个数据结构,支持单点插入,区间加等差数列,单点求值。
其实数据范围不大,可以根号算法,当然最好的做法肯定是手搓平衡树。
细节处理
不要忘记初始化。
后记
加油!坚持住!相信自己!
完结撒花!

浙公网安备 33010602011771号