..

LibreOJ β Round #3

T1. 绯色 IOI(开端)

10

$n \le 10$

暴力枚举所有环状回路,时间复杂度 $\mathcal O(n! n)$。

使用回溯法在枚举时计算答案,并且只考虑 $1$ 为起点的回路,时间复杂度 $\mathcal O((n - 1)!)$。

30

$n \le 20$

记 $f_{S, i}$ 表示从点 $1$ 出发且经过 $S$ 中每个结点恰好一次最后到点 $i$ 的路径长度最小值,其中 $i \in S$。

\[f_{S, i} = \min_j \\{ f_{S - \\{ i \\}, j} + (w_i - w_j)^2 \\}\]

答案为 $f_{V, 1}$。

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

100

$n \le 100000$

发扬人类直觉,按照点权排序。

考虑每次走相邻的点,但是这样 $n \rightarrow 1$ 的边权会很大,那么每次隔一个点走,跳过的点留给反方向。

形式化地,连边 $(1, 2), (n - 1, n)$ 以及所有边 $(i, i + 2)$($i = 1, 2, \cdots, n - 2$),构成的回路即为最优解。

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

T2. 绯色 IOI(抵达)

15

$n \le 10$

暴力枚举所有排列,求出每个城市的庇护所判断是否合法。

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

45

$n \le 2000$

设 $i$ 的庇护所为 $p_i$,则 $p_i$ 中所有环长为 $2$,即 $i$ 和 $p_i$ 构成完美匹配。

使用网络流或匈牙利算法求出完美匹配,转化为拓扑排序问题,将每个城市的庇护所向与它连边的非庇护所的城市连一条有向边。

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

55

每条道路满足 $v - u = 1$

  • 当 $n$ 为奇数时,不存在合法解。
  • 当 $n$ 为偶数时,前面一部分为连续上升的奇数,后面一部分为连续下降的偶数。

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

100

$n \le 5 \times 10^5$

借助树的特殊可以使用树形 DP 等算法在线性时间内求出其完美匹配,然后使用优先队列维护拓扑排序。

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

T3. 绯色 IOI(危机)

20

$n \le 300$

性质一说明这是个 DAG,求和式表明答案只与相邻两项有关,于是 DP。

记 $f_i$ 表示以 $i$ 结尾的最大安全程度。

\[f_i = \mathop{\max} \limits_{j 能直接或间接引爆 i} f_j + F(v_j, v_i)\]

注意间接也是要算的,于是先建出 DAG 然后求传递闭包。

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

30

$n \le 3000$

使用 std::bitset 优化传递闭包。

时间复杂度 $\mathcal O(n^2 + \frac{n m}{w})$。

40

$v_i = 1$

$v_i = 1$,那么 $F(1, 1) = 1$,问题转化成求以每个点结尾的最长链长,使用线段树维护区间最值。

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

55

$v_i \in \{ 0, 1 \}$

$v_i \in \{ 0, 1 \}$,只有 $F(0, 0) = 1$ 其余都是 $1$,使用两棵线段树分别维护 $v = 0$ 和 $v = 1$ 的点的区间最值,转移时分类讨论。

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

T4. 绯色 IOI(悬念)

34

$n \le 100$
$q \le 100$

暴力 $\mathcal O(n^2)$ 建图,每次修改后重新求匹配。

可以证明边数是 $\mathcal O(n)$ 级别。

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