April Fools' Problem (medium) 题解
首先尝试贪心,但是发现贪心会假,再尝试 dp,但发现 dp 有后效性,于是尝试万能算法网络流。
首先有一种很显然的连边方式:
将 \(a_i\) 和 \(b_i\) 分开排列,将源点连向所有 \(a_i\),容量 \(1\) 代表每个 \(a_i\) 只能选一次,费用 \(a_i\),将每个 \(a_i\) 连向每一个 \(b_j,j\ge i\),容量 \(1\),费用 \(0\)。再将每个 \(b_j\) 连向汇点。
但是显然这样不能满足只选 \(k\) 个数,所以我们将汇点拆点为 \(t_0\) 和 \(t\),将所有的 \(b_j\) 连向 \(t_0\),再将 \(t_0\) 连向 \(t\),费用 \(0\) 容量 \(k\) 以满足选数的个数限制。
但是此时复杂度又超了!
仔细观察发现其实我们将 \(a_i\) 连向每个 \(b_j\) 的实质是让源点向 \(a_i\) 连的边与 \(b_j\) 连的边连通以达到选每个数的目的,但其实完全没必要,我们可以把所有的 \(a\) 和 \(b\) 缩成一个点 \(i\)。将源点向每个 \(i\) 连边,费用 \(a_i\) 容量 \(1\),将每个 \(i\) 向 \(t_0\) 连费用 \(b_i\) 容量 \(1\) 的边,最后将每一个 \(i\in[1,n)\) 向 \(i+1\) 连费用 \(0\) 容量 \(1\) 的边代表我可以选所有比当前 \(i\) 更大的 \(i+x\)。

浙公网安备 33010602011771号