(本文仅包含技巧和例题,无题目解析)
抽屉原理
抽屉原理通常的表述时,将 \(n\) 个物品放入 \(k\) 个抽屉,则其中必有一个抽屉包含至少 \(\lceil\frac nk\rceil\) 个物品也一定有一个抽屉包含至多 \(\lfloor\frac nk\rfloor\) 个物品。
在一些构造题中,经常会要求构造一个权值至多(少)为某个数的方案。这时候可以考虑找出若干个可行的方案使他们的权值之和为定值。假设找出了 \(k\) 个可行的方案,总权值和为 \(n\),根据抽屉原理,其中最小权值一定不超过 \(\lfloor\frac nk\rfloor\),最大权值一定不少于 \(\lceil\frac nk\rceil\)。
很多时候其实是找到一些方案使每个单位(比如点/格子/物品等)的贡献次数相同,比如每个点只被一个方案包含。
方案数可以观察题面要求的分母,比如要求操作数不超过 \(\lceil\frac n3\rceil\) 次,那么可能就需要找出 \(3\) 种或 \(6\) 种方案。
例题
递归、归纳法
在一些构造题中,对于不同的输入,问题的结构有很大的相似性。在很多时候,这往往意味着我们的构造也具有很大的相似性,或是具有周期性。这时往往可以通过递归的方式,对子问题进行构造,并在子问题的构造的基础上进行一些小的调整,来得到原问题的构造。
本质都是通过证明 / 构造更小范围内有解,边界有解,并且可以通过操作将问题转化为更小范围进行构造。
需要注意的时转化为更小的数据范围时不能丢掉题目性质。
可以考虑一种满足限制条件的一般情况,以某一种方式(按题目要求)加上一个单位(点、格子、物品等)是否依然满足限制条件。
例题
CF1515F Phoenix and Earthquake
DFS树
在解决一些图上的构造问题时,DFS 树往往有非常大的帮助。
一张图的 DFS 树是在对其进行深度优先遍历时,所形成的树结构。建立了 DFS 树后,图上的边可以分成四类:
- 树边即每个点到其所有孩子结点的边,也即每个点第一次被访问时经过的边。
- 前向边是每个点到其后代的边,不包括树边。
- 后向边是每个点到其祖先的边。
- 其余边称为横叉边。
其中,前向边、后向边、横叉边统称为非树边。
在构造题中,通常我们用到的是无向图的 DFS 树。如果我们将每条边按照第一次经过时的方向进行定向,则无向图的 DFS 树满足所有非树边都是后向边。这个性质在解题过程中有非常大的作用。
例题
图
比较常见的有 2-SAT,欧拉回路,环,二分图 等性质。
可以将一些数字上的东西转为图上的构造,再利用图的性质证明其合法性,同时通过证明推出一个合法的构造。
个人认为这部分的题需要一些数感。
例题
交互题
交互的主要目的是获取信息,要尽量最大化获得的信息,并进行区分,同时根据题目性质合理的选择询问。
有关求树的结构的题还有一个技巧,就是可以考虑先问出每个点的深度,当然有时候也可能是其他信息。