..

UOJ Round #17

A. 滑稽树上滑稽果

5

$n \le 5$

暴力枚举每个点的父亲。

时间复杂度 $\mathcal O(n^n)$。

15

$n \le 12$
保证存在合法的最优解是一条链

暴力枚举所有排列。

时间复杂度 $\mathcal O(n!)$。

25

$n \le 100$
保证存在合法的最优解是一条链。并且从根开始的每个滑稽值构成了一个序列,保证解的这个序列的字典序,在所有链对应的序列中最小

每次枚举和当前的滑稽值 and 起来最小的值加到后面。

时间复杂度 $\mathcal O(n^2)$。

40

$n \le 10^5$
保证存在合法的最优解是一条链。并且从根开始的每个滑稽值构成了一个序列,保证解的这个序列的字典序,在所有链对应的序列中最小

把相同的位提出来,这些位要么一定是每次没贡献,要么一定是每次有贡献。

剩下的位,每次一定会减去一位,从而最多只会用 $\mathcal O(log a)$ 次就减到 $0$ 了,每次暴力找最小的。

时间复杂度 $\mathcal O(n \log a)$。

70

$n \le 100$

部分分的贪心过程可能是错的。

把相同的位提出来,剩下的位我们希望尽快把他们变成 $0$。

考虑 DP,记 $f[S]$ 表示 $S$ 集合内的位为 $1$ 的时变成 $0$ 的最小代价。

每次枚举 $a[i]$,$f[S] = \min(f[S], f[S \& a[i]] + (S \& a[i]))$。

时间复杂度 $\mathcal O(n a)$。

100

$n \le 10^5$

可以每次不枚举一个 $a[i]$,而是枚举一个子集 $T$,强制把这个子集 $T$变成 $0$。

现在的问题是判断有没有一个数和 $T$ and 起来是 $0$。

每次 $cnt[i] = cnt[i (2^j)]$,从每个比 $i$ 多一个 $0$ 的位置转移就好了。

事实上,DP 时可以用贪心得到的解来进行剪枝。

时间复杂度 $\mathcal O(a^{log_2 3})$。

B. 滑稽树下你和我

5

$\mathrm{stx}$ 和 $\mathrm{sty}$ 均为叶子

直接输出两点距离。

20

保证存在最优方案,在任意时刻至少有一端点位于树的某结点上

考虑二分答案,记 $f[i][j]$ 表示是否存在某种方案使得最终一个点在点 $i$,一个点在点 $j$。

时间复杂度 $\mathcal O(n^2 \log n)$。

100

$n \le 1000$

对于两个状态,两个点所在的边相同,并且两个状态的两点间距离 $\le v$,那么这两个状态是两两可达的,因为把其中某一条直线摆平,另外一条直线肯定是单调的。

那么可以依此设计状态,记 $f[i][j]$ 表示是否存在某种方案使得一个点在点 $i$上,一个点在边 $j$ 上距离点 $i$ 最近的那个点上,$f[i][j]$ 为 $1$ 当且仅当点 $i$ 到边 $j$ 的最短距离 $\le v$ 且存在某个 $f[k][x]$ 为 $1$,其中 $k$ 是 $j$ 的某个端点,$x$ 是某个以 $i$ 为端点的边,或存在某个 $f[t][j]$ 为 $1$,其中 $t$ 与 $i$ 有边相连,BFS 转移即可。

单次转移复杂度为 $\mathcal O(deg_i)$,总时间复杂度 $\mathcal O(n^2 \log n)$。

C. 滑稽树前做游戏

10

$m = n - 1$,且 $a_i = 1$。

菊花图情况下答案为 $\frac{1}{2} + \frac{n - 1}{n}$。

30

$n \le 4$

手算打表。