周做题记录 #1
CF1083C Max Mex
Analysis
考虑怎么做单组,可以直接 \(\mathcal{O}(n^2)\) 做。考虑怎么不平方,发现可以尝试 check 一个 \(x\) 是否可行,条件是 \(0\sim x-1\) 可以被一条链串起来。可以二分,然后选择一种你喜欢的判断方式。
考虑用线段树维护这个东西,\([l,r]\) 区间维护值在 \([l,r]\) 内的数的形态,如果是一条链,那么就维护一下链的两个端点,最后只要判断四个点能不能被串起来,可以选择一种你喜欢的判断方式。
CF1749E Cactus Wall
Analysis
发现因为相邻的不能同时染,所以给棋盘黑白染色之后黑白是独立的,也就是说不存在黑墙和白墙连在一起。所以可以 DP 墙,不过拍一下发现 DP 炸了,需要写个最短路,然后就好了。
Solution
发现这东西实际上要求一个平面图最小割,只不过不能用一般的最小割模型来刻画限制,上面最短路实际上是在对偶图上面跑的,可以这么理解。
P8349 [SDOI/SXOI2022] 整数序列
Analysis
枚举了一堆根号结论……
首先可以想到一个暴力,找到两个元素的位置,把它们归并,然后 \(\mathcal{O}(n)\) 扫一遍。
然后发现这个东西的复杂度是 \(\mathcal{O}(S_x+S_y)\) 的,并且有 \(\sum S_x=n\),如果有 \(\mathcal{O}(\min(S_x,S_y))\) 的查询方法,那么根据 [CmdOI]口头禅 的做法,复杂度是根号的。但是可惜好像并没有这样的做法,因为端点可能在较大的那边,比较难处理。
考虑根号分治,小块和小块之间复杂度不超过根号,大块之间因为数量少总复杂度也不超过根号,唯一的问题是小块和大块之间。考虑大块的话,只有数量上的性质,不好处理。考虑小块,小块的结论是元素数不超过 \(B\),那么根据另外一个著名结论,如果 \(S_x\leq B\),那么 \(\sum S_x^2\leq nB\),所以可以枚举所有小块区间,大块的话,发现区间数量也是 \(\mathcal{O}(nB)\) 的,所以可以先枚举长度,对于定长区间统一处理,稍加转化就是矩形修改和矩形求 \(\max\) 问题了,只会分治做,复杂度好像只能 \(2\log\),平衡一下应该是可以做到总复杂度 \(\mathcal{O}(n\sqrt{n}\log n)\) 的,但是不想写。
Solution
其实有一个直觉:对于大块来说,有用的点不会很多。但是我没有尝试证明或者证伪这个结论,觉得一眼假就弃了,其实可以考虑一个证明:考虑只有一个数的情况,有用的只有它前面和后面的元素,两个数的话,那就加上这个数前面和后面各一个没选的数。最后元素总数是 \(\mathcal{O}(B)\) 的,把这些元素拿出来跑暴力就好了。注意这些元素并不一定是连续的,中间没选的可能会干扰区间中数的数量,不过可以发现不存在跨过这些元素的区间,把两边断开分别跑就好了,复杂度根号里面 \(\log\)。
Conclusion
其实度过了靠套路做题的阶段,题目的难点主要就在于对性质的发掘和对模型的转化了,直觉是其中重要的一环,如果有直觉可以不要着急否定,先尝试严谨证明;多做题积累直觉。
CF671D Roads in Yusland
Analysis
线段树合并板子。
Solution
开始考虑过最小割,但是没想到用线性规划模型刻画,毕竟网络流是线性规划的子集,网络流遇到了一些问题可以考虑线性规划刻画。
假设 \(w_i\) 表示每条边的选择情况,有:
假设前面对偶变量是 \(x_e\),后面对偶变量是 \(y_i\),将其对偶:
发现 \(y_i\) 其实没啥用,把它去掉:
考虑将 \(x_e\) 从 \(0\) 开始往上调整,发现如果有位置大于 \(v_i\) 了,那么所有 \(x_e\) 的系数都会变成非正数,这是不优秀的,所以最优解不会让 \(x_e\) 的和大于 \(v_i\),所以问题变成了最大化 \(x_e\) 的和,且 \(x_e\) 和不超过 \(v_i\)。
这个的话,从小到上贪心能选即选即可,用左偏树维护路径。
P8123 [BalticOI 2021 Day1] Inside information
Analysis
终于来补这题了吗。
给树上的每条边赋一个权值 \(t_i\) 表示加入时间,那么问题相当于:
- 查询 \(x\to y\) 的有向路径上边权是否递增,且最大权值不超过给定值 \(t_i\)。
- 查询有多少个点满足如上条件。
对于第一个,由于是路径,点分转化。对于第二个,由于是联通块,点分转化。
所以我们就把询问挂到了根上。写一下合法条件发现就是二维偏序,扫描线做到 \(\mathcal{O}(n\log n)\),套点分再加一个 \(\log\)。
P5296 [北京省选集训2019]生成树计数
Analysis
肯定是矩阵树,考虑怎么转化为边权乘积。
考虑要维护的东西:\(a^k,b^k\),把它们合并就是 \((a+b)^k\),拆开就是 \(\sum_{i\leq k}\dbinom{k}{i}a^i b^{k-i}\),好家伙这不二项卷积吗,写出 \(b^k\) 的 EGF 形式就是 \(\sum_{i\leq k}\dfrac{b^i}{i!}x^i\),把这些多项式卷起来就好了,复杂度 \(\mathcal{O}(n^3k^2)\)。
猜测和 \(e\) 有关系,实际上这个就是把一条边的权值 exp 之后变成乘法了。
P8352 [SDOI/SXOI2022] 小 N 的独立集
Analysis
考虑普通的最大权独立集怎么求,然后就一脸 DP of DP 的样子。设 \(f_{u,i,j}\) 表示 \(f_{u,0}=i,f_{u,1}=j\) 的方案数,然后可以发现 \(j\leq i+k\) 并且 \(j<i\) 的没啥用,所以状态数就 \(\mathcal{O}(n^2k)\) 了,总复杂度应该是 \(\mathcal{O}(n^2k^3)\)。
UVA1364 Knights of the Round Table
Description
给定一张无向图,找出所有点,满足它至少在一个简单奇环中出现。
Analysis
我直接找生成树然后树上差分过了,怪。
Solution
图上简单环问题考虑点双是不错的选择,因为点双满足一个优秀的性质:对于每两个点 \(x,y\),保证存在两条不相交的从 \(x\to y\) 的路径。那么在这个结构上,可以认为有这样一个性质:若一个点双内存在奇环,那么点双内的所有点都是合法点。证明不难。
P3296 [SDOI2013]刺客信条
Description
给定一棵树和两个 \(01\) 序列 \(a,b\),现在你可以翻转 \(a,b\) 中的任意位,问最少的翻转次数,使得存在排列 \(p\),满足 \(a_{p_i}=b_i\) 且若 \(u,v\) 间有边,那么 \(p_u,p_v\) 间有边。
Analysis
首先找到一个简单的转述:对于排列 \(p\),它的权值为 \(a\cdot p,b\) 的不同位数,求权值最小的合法排列。
尝试找到 \(p_1\),那么 \(p_1\) 周围就是若干个子树,现在需要把这些子树和 \(1\) 周围的子树匹配,匹配的条件是两棵子树同构,要求权值最小。那么可以搜出匹配方案,然后记忆化一下,状态数不超过 \(\mathcal{O}(n^2)\)。然后发现匹配不需要爆搜,用 KM 跑二分图最小权完美匹配就好了,复杂度不超过 \(11^3\),而且这个东西显然跑不满,可以通过。
KM 学一遍忘一遍。
P4365 [九省联考 2018] 秘密袭击 coat
现在才来补??
题目让我们求这个式子:
考虑每个 \(d_i\) 的贡献,直接树上背包可以做到 \(\mathcal{O}(n^2k^2)\),使用 DFS 序优化背包可以做到 \(\mathcal{O}(n^2k)\)。
这个 DP 没有优化的前途了,考虑差分式子,具体地,将 \(x\) 拆成 \(\sum_{i\leq x}1\),式子变成:
考虑针对 \(cnt(S,i)\) 做一个 DP。枚举 \(i\),然后做背包可以做到和上面一样的复杂度。
考虑优化,先忽略枚举 \(i\) 的部分,将 \(i\) 塞到状态里面,设 \(f_{u,i,j}\) 表示 \(u\) 结点子树内有 \(j\) 个数满足 \(d_v\geq i\) 的联通块数,\(F_i(x)\) 为它的 GF,有:
直接维护多项式太慢了,考虑插值维护点值。那么只需要维护向量 \(F_{u}\),支持操作:
- 区间乘法,全局加法。
- 向量点积。
使用线段树合并可以维护。注意这里的线段树需要处理 \(x,y\) 为空节点 / \(y\) 两个儿子均为空的情况,而不是传统的递归到 \(l=r\)。说白了线段树合并就是特殊处理空节点和叶子,其余暴力。时间复杂度 \(\mathcal{O}(n^2\log W)\)。
Conclusion
涉及的技巧比较多,包括差分,维护点值等等。
以后每周要 vp 至少一场 + \(10\) 题补题,周六清算,根据实际情况可能有调整,另外最好写一些 start coding 时间,不要在代码上花太久。
P5307 [COCI2018-2019#6] Mobitel
Analysis
定义 \(f_{i,j,k}\) 表示走到 \((i,j)\),\(k=\dfrac{n}{mul}\) 的方案数,复杂度 \(\mathcal{O}(rs\sqrt{n})\)。
CF1268D Invertation in Tournament
Analysis
首先竞赛图缩点之后是一条链状结构,在链上考虑。手玩一下,发现如果有至少三个强连通分量,那么在中间随便找一个翻转就变成强连通分量了。那么只要考虑两个强连通分量的情况,继续手玩,发现如果其中一个存在长度为 \(n-1\) 的环那么就比较好做,但是如果没有怎么办呢?
Solution
首先有结论,任意 \(n>3\) 的强连通竞赛图存在长度为 \([3,n]\) 的所有环,证明可以考虑归纳。所以只要考虑两个都 \(n\leq 3\) 的情况,暴力即可。
现在只需要考虑怎么快速判断翻转之后是否为强联通竞赛图即可。使用兰道定理,内容如下:
- 一个有向图为竞赛图,当且仅当它的出度序列 \(s_i\) 排序后满足 \(\sum\limits_{j\leq i}s_j\geq\dbinom{i}{2}\)。
- 一个竞赛图为强连通竞赛图,当且仅当其出度序列排序后满足 \(\sum\limits_{j\leq i}s_j>\dbinom{i}{2}\)。
Conclusion
我的思考卡在了猜想到如果有长度为 \(n-1\) 的环即问题解决这一步,当初我猜到了结论,但是我认为其结论成立则最优解不会超过 \(1\),而样例 \(2\) 与之矛盾,但实际上最终的结论是一个较弱的结论:加上了 \(n>3\) 这一个前提,实际上如果考虑证明这个结论的话,即使不能证明原结论,也可以在证明过程中得到一定启发。
P7126 [Ynoi2008] rdCcot
Solution
如果直接考虑联通块的话,模型的结构过于复杂,难以解决,考虑转化视角,考虑每个等价类内的一个“代表元”。在本题中,我们可以考虑联通块中 bfs 序最小的点,有结论:
- 一个点 \(x\) 为联通块中 bfs 序最小的点,当且仅当不存在 bfs 序更小的点 \(y\),使得 \(x\) 能直接到 \(y\)。
充分性显然,考虑必要性。先证明一个引理:若存在链 \(x\to y\to z\),满足 \(d_y<d_x<d_z\),则 \(x\to z\)。证明显然。根据此引理,归纳调整即可证明原结论。
所以考虑 \(x\) 作为 bfs 序最小点时区间需要满足什么条件,可以发现它只会被左侧最大的 bfs 比它小的点和右侧最小 bfs 序比它小的点替代。使用点分治+平衡树可以解决问题,复杂度 \(\mathcal{O}(n\log ^2n)\)。
vector 存图 TLE 换成链式前向星过了,离谱。
Conclusion
计数等价类数量,钦定代表元的思路,以及 BFS 序的性质。
有些时候原问题会较为复杂,但是转化视角和模型之后,问题便变得简单。WC2022 T1 也是一个例子,将视角由阶梯方格转到轮廓线之后,“边缘格子”就得到了更好的刻画。

浙公网安备 33010602011771号