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\)

posted @ 2023-06-10 10:12  Pwtking  阅读(14)  评论(0)    收藏  举报