Alpha1022's Diaries
那儿,矛盾对立寂灭之处,即是涅槃。
挚爱的渴望之星,依然向我灼灼燃烧。
Set #10 做题记录
  1. QOJ 130
  2. QOJ 665 / 7762
  3. QOJ 1197
  4. QOJ 1359
  5. QOJ 2208
  6. QOJ 3299
  7. QOJ 4630
  8. QOJ 5048
  9. QOJ 6308
  10. QOJ 6508

\((u, v, c, w)\) 表示 \(u \to v\),容量 \(c\),费用 \(w\)


QOJ 130

暴力增广,每次求二次函数极值即可。


QOJ 665 / 7762

这其实是一个类似最小路径覆盖的问题,因此我们考虑先加入所有代价,然后尝试删掉尽量多的操作代价。

建图有很多方法,以下介绍一种我用的做法。

不妨假设 \(a_j\) 相邻不同,建立 \(K\) 个点 \(T_1, T_2, \dots, T_{k-1}, T_K=T\) 和源点 \(S\)。连边:

  • 连边 \((S, T_1, M-1, 0)\)

  • 对于 \(i=1,2,\dots,K-1\),连边 \((T_i, T_{i+1}, +\infty, 0)\)

  • 对于 \(1 \le i < j \le K\) 满足 \(a_i = a_j\)\(a_{i+1}, \dots, a_{j-1} \ne a_i\),连边 \((T_{i+1}, T_j, 1, -w_{a_i})\)

意思是,对于不需要在后面继续利用的球,我们不妨单独分出一个盒子专门放它们。于是剩下你可以有 \(M-1\) 个盒子用来处理掉一些代价(注意没有相邻相同,因此这个限制是紧的)。

\(S\)\(T\) 的最小费用最大流即可。


QOJ 1197

第一个观察是,我们可以先涂黑色的线,再涂白色的线,然后剩下的是否要涂是唯一确定的。

另一个观察是,每个点,每个方向只需要涂一次,即便颜色不同。颜色相同时是显然的,颜色不同时在上面的一定是白色,也有办法用底色替代。

考虑 01 变量 \(bh_{i,j}, bv_{i,j}, wh_{i,j}, wv_{i,j}\) 表示是否将 \((i, j)\) 在水平 / 垂直方向涂成黑 / 白色。

然后我们来刻画一下代价:

  • 对每个格子 \((i, j)\),有代价 \(\infty \cdot (bh_{i, j} \cdot wh_{i, j} + bv_{i, j} \cdot wv_{i, j})\)

  • 涂黑色水平线的代价是 \(a \cdot \sum_{i, j} bh_{i, j} + b \cdot\sum_{i, j} bh_{i, j} \cdot \overline{bh_{i, j+1}}\)。类似地也有其他三种代价。

  • 单独涂黑色格子 \((i, j)\) 的代价是 \(c \cdot \overline{bh_{i, j}} \cdot \overline{bv_{i, j}} + \infty \cdot (wh_{i, j} + wv_{i, j})\)

  • 单独涂白色格子 \((i, j)\) 的代价是 \(c \cdot (bh_{i, j} \cdot \overline{wv_{i, j}} + bv_{i, j} \cdot \overline{wh_{i, j}}) + \infty \cdot bh_{i, j} \cdot bv_{i, j}\)

然后我们把 \(bv, wh\) 反转,那么每一项都是交叉项,可以变成最小割。


QOJ 1359

首先点拆边,点数变为 \(2n\)。转化成一些边可以选择安装地图。然后考虑每个点有一个 \([0, k]\) 的整数变量 \(f_u\) 表示 \(S\)\(u\) 最少要经过多少个地图。

一条边 \((u, v)\) 如果不能放地图,那么要求 \(f_v \le f_u\);如果可以放地图,那么可以选择 \(f_v \le f_u+1\),但是会有 \(C_{(u, v)}\) 的代价。

考虑改为定义 \(2n(k+1)\) 个 0/1 变量 \(g_{u, j} = [f_u \ge j]\)。那么有以下的代价:

  • 基本限制 \(\infty \cdot \overline{g_{u, 0}} + \infty \cdot \sum_j g_{u, j} \cdot \overline{g_{u, j-1}}\)
  • 基本限制 \(\infty \cdot g_{S, 1} + \infty \cdot \overline{g_{E, k}}\)
  • 对于不能放地图的 \((u, v)\),有 \(\infty \cdot \sum_j \overline{g_{u, j}} \cdot g_{v, j}\)
  • 对于可以放地图的 \((u, v)\),有 \(C_{(u, v)} \cdot \sum_j \overline{g_{u, j}} \cdot g_{v, j} + \infty \cdot \sum_j \overline{g_{u, j-1}} \cdot g_{v, j}\)

构造方案也不难,只需要检查哪些 \((u, v)\) 满足存在 \(\overline{g_{u, j}} \cdot g_{v, j} = 1\) 即可。


QOJ 2208

仔细思考容易发现这其实是最大费用循环流,进一步左右部点可以合并,因此先假设所有边都满流然后调整即可。


QOJ 3299

我们容易扩展 Hall 定理猜到条件是对于任意集合 \(S\) 满足 \(\sum_{i\in S} a_i \le \sum_j \min(b_j, |S|)\)

直接维护 \(f_k = \max_{|S|=k} \left(\sum_{i\in S} a_i - \sum_j \min(b_j, |S|)\right) = \max_{|S|=k} \sum_{i\in S} a_i - \sum_j \min(b_j, k)\)

注意到 \(a, b\) 的修改只有 \(\pm 1\),对 \(f_k\) 的影响也只是区间 \(\pm 1\),线段树即可。


QOJ 4630

把用 Dinic 多路增广的 Primal-Dual 搬出来,过了,咋回事?

这是显然的,因为最短路总是不小于 \(-5\),每轮增广是 \(O(m \sqrt n)\),而当最短路到 \(0\) 的时候就可以退出了。


QOJ 5048

考虑每次取出外围的边中最小的,考虑其所在的内部面,结合对偶图最短路容易证明在任意最小割中该面一定经过 \(0\)\(2\) 条边。

那么我们将这条边删去,将容量加到同一个面的其他边上即可。

直到剩下一棵树,我们知道原图的最小割与该树的最小割等价,于是它便是原图的最小割树,Kruskal 即可。


QOJ 6308

操作可以转化成维护 \(01\) 序列 \(b_1, \dots, b_n\),每次将 \(b_l, b_r \gets 1\)\(b_{l+1}, \dots, b_{r-1} \gets 0\),最大化 \(1\) 的个数。

考虑任意两个区间的关系,如果是包含或相离,那么互相不会影响。如果是相交,那么会出现矛盾。可以证明只要不存在相交就一定合法。

二分图最大匹配即可。


QOJ 6508

不妨将题意弱化成子图的各个点度数 \(\le 2\),首先最小化孤立点个数,然后最小化二度点个数即可。容易知道最优解一定没有长度 \(> 3\) 的链。

因此取一个较大数 \(M\),给每个点连两条边,容量均为 \(1\),费用分别为 \(-M, 1\),然后跑最小费用流(不必最大)即可。

掏出 Dinic 实现的 Primal-Dual 即可。