CF573 合集

云落碎碎念

  1. 题面翻译取自 luogu,本蒟蒻也会安置原题链接
  2. 不保证文章中不出现“显然”或者“注意到”,可能会出现“易证”
  3. 有写错的地方欢迎各位神犇指正

前言

只有阳光洒在身上的时候,我才发觉冬天那刻骨铭心的寒。

动态规划 or 找性质专场。

CF573A

题解

题目传送门

简单数论题,给每个数刨去 \(2,3\) 的质因子,对剩下的部分判等。

时间复杂度上是没有问题的,不需要分解质因数,直接试除法就能行,单次 \(/2\),所以每个数 \(\log\) 次。

细节处理

感觉上没什么细节。

CF573B

题解

题目传送门

我真是服了,被 DP 题暴打了,结果一看,是个黄题……

一开始想歪了,上去就是一套二分答案,然后不可做,死活没想到 DP 可以转移。

\(f_i\) 表示 \(i\) 这根柱子被摧毁的最小时间,有转移:

\[f_i = \min (f_{i-1}+1,a_i,f_{i+1}-1) \]

然后我就卡在这里了,根本不知道这个东西怎么去转移。

后来说可以正着扫一遍,再倒着扫一遍,给我看傻了……

实际上可以这么去理解,记 \(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 转移如下:

\[f_{i,j} = \max(f_{i-1,j},f_{i-1,j-1}+a_i \times j) \]

根据题解区,各路神仙直接开始证明,观测到上述两种转移是存在一个分界点 \(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\) 转移过来,相当于单点插入。

问题转化为需要一个数据结构,支持单点插入,区间加等差数列,单点求值。

其实数据范围不大,可以根号算法,当然最好的做法肯定是手搓平衡树。

细节处理

不要忘记初始化。

后记

加油!坚持住!相信自己!

完结撒花!

posted @ 2025-10-19 08:57  sunxuhetai  阅读(35)  评论(0)    收藏  举报