UR #27 题解报告
UR #27 题解报告
景点观光
题意
给定一棵 \(n\) 个点的以 \(1\) 为根的树,和 \(m\) 个关键点,每次移动可以走一步或两步,要求从根出发,经过所有关键点并回到根。\(q\) 此询问若最多进行 \(t\) 次走两步的操作,最少步数是多少。
分析
考虑因为是同一张图,所以限制操作次数是假的,求最多进行的次数是真的。
首先观察到几个性质:
- 绝不会走到子树中不存在关键点的节点上(即只会在虚树上走);
- 一定沿着虚树的一个欧拉序走。
证明是显然的。
至此可以考虑设计 DP:\(f_{u, 0/1/2}\) 表示,\(u\) 的子树,出入均为 \(u\)/出入分别是 \(u\) 和 \(u\) 的一个儿子/出入分别是 \(u\) 的某两个儿子(可以相同)的最小步数。
转移实际上是儿子间的互相拼接和首尾与父亲相接两个部分的并。
儿子间的拼接可以考虑贪心。例如 \(0\) 尽量放在一起,\(2\) 尽量放在一起,\(1\) 的分为“子进父出”和”父进子出“交替拼接最优。
发现由于改变一个儿子选的 \(0/1/2\) 状态至多对拼接消耗影响 \(1\),所以贪心的取三种状态的最小值不劣(相等优先状态标号小的)。依据此结论可维护出儿子所选状态集合 \(S\)。
父子拼接同样考虑贪心:
- \(f_{u, 0}\),分类讨论:若 \(S\) 中不存在 \(1\),那么 \(0 \dots 0 1 \dots 1\) 最优;反之,记 \(2_0\) 为父进子出、\(2_1\) 为子进父出,有最优构造 \(2_1 0 \dots 0 2_0 2_1 2_0 \dots 1 \dots 1\);
- \(f_{u, 1}\):最优构造一定形如 \(0 \dots 0 2_0 2_1 2_0 \dots 1 \dots 1\);
- \(f_{u, 2}\):这种状态下可能贪心就寄了,分类讨论:若仅一个有用儿子,则暴力枚举三种情况;反之,贪心大概还是成立的,最优形式是 \(0 \dots 0 2_0 2_1 2_0 \dots 1 \dots 1 2_1\),但是还要考虑一种全部去 \(0\) 的情况(可能省去头尾的贡献)。
总复杂度 \(\mathcal O(\sum (n + q))\)。
Code
提交记录:https://uoj.ac/submission/707684。
509 号迷宫
题意
给定 \([0 \dots n] \times [0 \dots n]\) 的矩阵,对于 \(1 \le i \le n\),第 \(i\) 行均有恰一个障碍点,若每次只能向右或向下移动,问从 \((0, 0)\) 到 \((n, n)\) 的合法路径数对 \(P\) 取模的结果。
\(P = 509, n \le P^2, P \mid n\)。
分析
太天才了,这题!
先考虑没有障碍物,那么两点的方案数是简单的,只需算一个组合数即可!接着又一个很天才的发现,由于 \(\dbinom{P}{k} \bmod P = [k = 0 \lor k = P]\),所以我们可以考虑对了两点的距离按 \(P\) 分块!即考虑按照斜线分块,只考虑 \(P \mid x + y\) 的 \((x, y)\) 的方案数,那么如果没有障碍点,则复杂度是 \(\mathcal O(\dfrac{n^2}{P})\)。
加入障碍点怎么办呢,我们可以考虑容斥,减掉不合法的情况。具体的我们按照行数从小到大遍历两条直线间的障碍,因为我们经过的障碍点路径一定满足行数递增。然后我们对每个点计算它作为第一个碰到的障碍点的方案数,因为我们的斜线之间间隔为 \(P\),所以其间的一个点最多考虑行数觉得值和其相差不超过 \(P\) 的点,复杂度 \(\mathcal O(nP)\)。
Code
提交记录:https://uoj.ac/submission/707787。