UOJ Round #11
A. 元旦老人与汉诺塔
30
$n \le 50$
$m \le 10$
每个状态下能进行的操作最多有 $3$ 种,暴力枚举每一步的选择判断是否与目标状态相同。
时间复杂度 $\mathcal O(3^m n)$。
50
$n \le 10$
$m \le 50$
汉诺塔的合法状态只有 $3^n$ 种,开一个数组 DP,状态包含当前步数及状态。
时间复杂度 $\mathcal O(3^n m)$。
100
$n \le 100$
$m \le 100$
使用记忆化搜索。
B. 元旦老人与丛林
20
$n \le 10$
$m \le 20$
暴力枚举边集判定。
时间复杂度 $\mathcal O(2^m m)$。
40
$n \le 300$
$m \le n + 7$
保证图连通
在一棵树上加了很少的边,考虑把无用的点和边删掉。
可以发现度数小于等于 $2$ 的点是否存在是没有影响的,于是每次找一个度数小于等于 $2$ 的节点删掉,最后剩下边数很少,直接暴力枚举。
50
每个点的度数都不小于 $4$
每一个点的度数都不小于 $4$,所以可以得到 $m \ge 2n$,显然无解,输出 No
。
80
$n \le 300$
$m \le 600$
如果图的每一个非空子图都满足 $\lvert E \rvert \le 2 \lvert V \rvert - 2$,那么它一定是丛林。
问题转化成判断当前的图是否存在一张非空子图满足 $\lvert E \rvert \gt 2 \lvert V \rvert - 2$,这个问题又可以转化成最大权非空闭合子图。
新建一张 $n + m$ 个点的图,其中前 $n$ 个点的权值是 $- 2$,后 $m$ 个点的权值是 $1$,如果在原图中第 $i$ 条边连接的点是 $u_i$ 和 $v_i$,那么就分别连上 $i + n$ 到 $u_i$ 和 $v_i$ 的边,只需判断新图的最大权非空闭合子图的权值是否大于 $- 2$。
直接做是不行的,因为当最大权非空闭合子图的权值小于 $0$ 时,最大权闭合子图的权值就是 0。
我们可以强制选取某一个点,即把某一个点的权值设为 $0$,如果存在一个包含这个点的子图满足 $\lvert E \rvert \gt 2 \lvert V \rvert - 2$,那么这个子图的权值就变得大于 $0$ 了。
枚举这个点,跑 $n$ 次网络流,时间复杂度 $\mathcal O(n m \sqrt n)$。
100
$n \le 2000$
$m \le 4000$
相邻两次最大流之间只有两条流量为 $2$ 的边发生变化,所以直接用退流搞。
时间复杂度 $\mathcal O(\sqrt{n} m + n m)$。
C. 元旦老人与数列
10
$n \le 3000$
$m \le 3000$
暴力模拟。
时间复杂度 $\mathcal O(n m)$。
30
不存在操作二
历史最值问题。
线段树上打永久标记即可。