核桃作业复习
核桃作业复习
第一课 邻项交换
P1248 加工生产调度
考虑邻项交换确定加工顺序,对于两个物品 \(i,j\),加工时间分别是 \(\max(b_i,a_j)+a_i+b_j\) 和 \(\max(b_j,a_i)+b_i+a_j\)。
令第一种更优则移项后得到 \(\max(b_i,a_j)-a_j-b_i\leq \max(b_j,a_i)-a_i-b_j\),化简得 \(\min(a_i,b_j)\leq \min(a_j,b_i)\)。
这个关系不符合严格弱序,具体的它没有传递性,不能直接比较为邻项交换。
经过分类讨论得到:
- 当 \(a_i<b_i\) 时候,如果 \(a_j<b_j\) 则应该有 \(a_i\leq a_j\);如果 \(a_j\geq b_j\) 则原式恒成立。
- 当 \(a_i=b_i\) 时候,如果 \(a_j<b_j\) 则应该有 \(a_i\leq a_j\);如果 \(a_j=b_j\) 则原式恒成立;如果 \(a_j>b_j\) 则有 \(b_i\leq b_j\)。
- 当 \(a_i>b_i\) 时候,如果 \(a_j\leq b_j\) 则原式恒成立;如果 \(a_j>b_j\) 则有 \(b_i\geq b_j\)。
所以最终策略是将所有产品按照 \(a_i<b_i\),\(a_i=b_i\),\(a_i>b_i\) 的顺序依次排列,然后 \(a_i<b_i\) 之间按照 \(a_i<a_j\) 排序,\(a_i=b_i\) 之间随意顺序,\(a_i>b_i\) 之间按照 \(b_i>b_j\) 排序。
AGC023F 01 on Tree
如果一个节点点权为 \(0\) 则当它父亲选择后它一定立刻被选择,所以将所有零节点与它父亲合并。合并完之后仍然是一棵树,每个节点包含有零一点权 \(c_{x,0/1}\) 个。记其特征值 \(a_i=\dfrac{c_{i,1}}{c_{i,0}}\)。
根据邻项交换对于两个节点 \(i,j\) 先选 \(i\) 更优当且仅当 \(a_i<a_j\)。所以对于 \(a_i\) 最小的节点,其父亲被选后其一定立刻被选,同样的可以与其父亲合并成一个点,修改新的特征值。使用堆维护上述过程,每次找出特征值最小的点即可。
第二课 最短路1
[AGC056C] 01 Balanced
区间转为前缀和限制,记前缀和为 \(S_i\),有 \(S_i-S_{i-1}\in[0,1]\),限制为对区间 \((l,r]\) 要求 \(S_r-S_l=\frac{r-l}{2}\)。
但是直接差分约束有负权复杂度不对。考虑建立等价关系描述限制以求没有负权,将其拆分为 \(2S_r-r=2S_l-l\)。
那么令 \(x_i=2S_i-i\),限制变为 \(x_i=x_j\),还有 \(x_i\leq x_{i-1}+1\) 和 \(x_{i-1}\leq x_i+1\)。将所有 \(x_i=x_j\) 的 \((i,j)\) 缩成一个点,在所有缩完的点之间建立剩下两条关系的差分约束,这样没有负权就不用跑 SPFA 了。
P7515 [省选联考 2021 A 卷] 矩阵游戏
先不考虑 \(0\leq a_{i,j}\leq 10^6\) 的限制,只找到一组合法的 \(a\)。钦定 \(a\) 下边界和右边界都是 \(0\),根据 \(b\) 依次推出所有的 \(a\) 即可。
发现对于一行进行 \(+x,-x,+x,-x,\cdots\) 的操作对应 \(b\) 不变,对于一列操作同样。设对于第 \(i\) 行操作值为 \(r_i\),第 \(j\) 列为 \(c_j\),则每个点的操作值 \(A_{i,j}\) 是 \(r_i\) 和 \(c_j\) 的和或差的形式,我们要求它满足 \(-a_{i,j}\leq A_{i,j}\leq 10^6- a_{i,j}\)。
但是有 \(x+y\) 的形式不好差分约束。考虑将所有偶数 \(i\) 的 \(r_i\) 取相反数,所有奇数 \(j\) 的 \(c_j\) 取相反数,那么矩阵形式统一为 \(x-y\),同时适当调整 \(A_{i,j}\) 的范围进行差分约束。
P7516 [省选联考 2021 A/B 卷] 图函数
考虑每个点对 \((i,j)(i<j)\) 的贡献(\(i=j\) 是好算的),计算 \(f(i,G)\) 时在 \(v=j\) 之前 \(i\) 已经被删除,所以只会在计算 \(f(j,G)\) 且 \(v=i\) 时可能有贡献。产生贡献的条件为存在 \(i\to j\) 的路径 \(P\) 和 \(j\to i\) 的路径 \(Q\) 所有点编号不小于 \(i\)。
设 \(t_{i,j}\) 表示所有 \((P,Q)\) 中 \(P\) 和 \(Q\) 的边权最小值最大是多少,则 \((i,j)\) 对于 \(h(G_k)(0\leq k < t_{i,j})\) 有贡献。
考虑对于每个 \(i\) 求所有 \(t_{i,j}\),将边按时刻 \(w\) 从大到小加入。对于边 \((u,v,w)\) 如果 \(\min(u,v)<i\) 则跳过,如果加入时 \(i,j\) 互相可达则 \(t_{i,j}=w\)。
\(j\) 可达 \(i\) 等价于反图上 \(i\) 可达 \(j\)。所以现在问题变为加入一条边,询问固定起点和随机终点 \((i,j)\) 可达性。每次加入边 \((u,v)\) 时如果 \(u\) 被标记且 \(v\) 没有则从 \(v\) 开始标记可达点,否则不进行操作。每次搜索碰到标记过的点就结束,每个点只会标记一次。总复杂度 \(O(nm)\)。
第三课 基础数据结构
UOJ671 诡异操作
考虑操作一,每次有效操作数值减小一半,容易势能线段树。考虑操作二,维护 \(v_{p,i}\) 表示线段树 \(p\) 节点的区间中二进制第 \(i\) 位为 \(1\) 的有多少个。由于 pushup/pushdown 复杂度 \(O(\log V)\),总复杂度 \(O(n\log^2V+q\log n\log V)\)。
考虑优化,对于一个节点 \(p\),\(v_{p,i}\) 是一个 \(\log len\) 位的二进制数,\(i\) 的取值区间是 \(\log V\),所以 \(v_{p,i}\) 可以看做一个 \(\log len\times \log V\) 的矩阵,我们目前在枚举 \(i\) 一列一列合并两个矩阵,复杂度 \(O(\log V)\)。
发现可以一行一行合并两个矩阵,用位运算同时模拟每列的加法,复杂度变为 \(O(\log len)\)。
由于 \(O(\sum \log len)=O(n)\),复杂度变为 \(O(n\log V+q\log^2n)\)。
P7739 [NOI2021] 密码箱
考虑一个连分数 \([x_1,x_2,x_3,\cdots]\) 求值,从下往上合并时是 \(\dfrac a b=\dfrac{1}{x_i+\frac{a_0}{b_0}}\),即 \(a=b_0,b=x_ib_0+a_0\)。
用矩阵描述为 \(\begin{bmatrix}a\\b \end{bmatrix}=\begin{bmatrix}0&1\\1&x_i \end{bmatrix}\begin{bmatrix}a_0\\b_0 \end{bmatrix}\)。所以连分数的答案是 \(\prod_i\begin{bmatrix}0&1\\1&x_i \end{bmatrix} \begin{bmatrix}0\\1 \end{bmatrix}\)。
W 操作容易用矩阵表示为 \(\begin{bmatrix}1&1\\0&1 \end{bmatrix}\),即 \(\begin{bmatrix}0&1\\1&x \end{bmatrix}\begin{bmatrix}1&1\\0&1 \end{bmatrix}=\begin{bmatrix}0&1\\1&x+1 \end{bmatrix}\)。
E 操作也可以表示为矩阵 \(\begin{bmatrix}0&-1\\1&2 \end{bmatrix}\),容易分类讨论验证正确性。
平衡树维护矩阵乘法,支持区间取反、区间翻转。
第四课 字符串基础
CF710F String Set Queries
强制在线 AC 自动机,但 AC 自动机无法在线,在添加串时 fail 更新复杂度没有保证。
考虑二进制分组,每次有两个组大小相同就合并成一个更大的组,合并方式是直接重构。
重构复杂度是 \(O(len|\sum|)\),每个点被重构 \(O(\log n)\) 次,总复杂度 \(O(len|\sum|\log n)\)。
第五课 同余数论
P7325 [WC2021] 斐波那契
对于任意整数 \(m\),普通斐波那契数列在模 \(m\) 下纯循环,循环节长度 \(O(m)\),且 \(f_i\perp f_{i+1}\)。
\(F_0=a,F_1=b\) 的第 \(p\) 项 \(F_p=af_{p-1}+bf_p\),证明考虑观察 \(F_i=xa+yb\) 的 \(x,y\) 分别的递推关系即可。
尝试将 \(af_{n-1}+bf_n=0\) 变式成 \(-\dfrac a b=\dfrac{f_n}{f_{n-1}}\bmod m\) 但 \(m\) 是合数。
移项并同时除掉 \(\gcd(a,b,m)\) 得 \(a'f_{n-1}=b'f_n\bmod m'\),此时可能没有逆元。
由于 \(f_{n-1}\perp f_n\),有 \(\gcd(f_n,m')=\gcd(a',m')=p\),\(\gcd(f_{n-1},m')=\gcd(b',m')=q\),同除 \(pq\) 后即可互质。
枚举 \(m\) 的因子 \(m'\),在 \(m'\) 处加入三元组 \((p,q,\dfrac{f_n} p(\dfrac {f_{n-1}}{q})^{-1}\bmod \dfrac{m'}{pq})\) 后即可处理询问。
复杂度 \(O(\sigma(m)\log m+n\log m)\),\(\sigma(m)\) 为因数和。
P3421 [POI 2005] SKO-Knights
设最终的两个答案向量为 \(a=(x_a,y_a),b=(x_b,y_b)\),则一定有一组答案满足 \(x_a=0\)。
思想是:在最终二维平面上的所有点中,\(x=a\) 的一条竖直线上相邻两点之间的间隔是相同的,不同的线上的相邻点的距离也是相同的,令 \(y_a\) 为这个值。假设 \(x=p\) 上有点,下一个有点的线是 \(x=q\),于是我们令 \(x_b=q-p\),取一个合适的 \(y_b\) 使得 \(x=p\) 上的某个点加上 \(b\) 后是 \(x=q\) 上的某个点。这样可以用 \(b\) 在每个竖线之间调整,用 \(a\) 取遍这条线上的所有点。
对于前 \(n-1\) 个向量的到的答案向量为 \((0,y_a),(x_b,y_b)\) 现加入一个向量 \((u,v)\)。
新的竖线为 \(x_bx+uy\) 的所有值,根据裴蜀定理,相邻两竖线之间的距离变为 \(x_b'=\gcd(x_b,u)\)。
假设 \(k_1x_b+k_2u=\gcd(x_b,u)\) 的一组解为 \((k_1,k_2)\),则 \(y_b'=k_1y_b+k_2v\)。原因是考虑 \(k_1(x_b,y_b)+k_2(u,v)\) 肯定是一个合法点,所以只需要令其合法点横坐标为 \(\gcd(x_b,u)\) 则对应系数取纵坐标就是一个可行解。
考虑 \(y_a\) 的更新,假设满足 \(k_1x_b+k_2u=0\) 的 \((k_1,k_2)\) 中 \(k_1y_b+k_2v\) 的最小正整数值为 \(C\),则 \(y_a'=\gcd(y_a,C)\),证明同上考虑找最小的合法点即可。求 \(C\) 可以考虑 exgcd 的通解形式调整。
P3518 [POI 2011] SEJ-Strongbox
若 \(x\) 是密码则所有 \(\leq n\) 的 \(\gcd(x,n)\) 的倍数是密码,\(kv\bmod n\) 取遍所有 \(\gcd(x,n)\) 的倍数。同时有 \(u,v\) 是密码则 \(\gcd(u,v)\) 是密码,根据裴蜀定理。因此设密码集合为 \(S\),\(S\) 恰好是 \(d=\gcd(n,\gcd_{x\in S}x)\) 的所有倍数。
设 \(d_i=\gcd(m_i,n)\),则 \(d\) 必须是 \(d_k\) 的因数且不是其它 \(d_i\) 的因数。找到最小的 \(d\),则答案为 \(\frac n d\)。
最初给所有 \(d_i\) 打上标记,从大到小枚举 \(n\) 的因子 \(c\),如果 \(c\) 有标记则给 \(\dfrac c {pri_j}\) 标记,\(pri_j\) 表示 \(n\) 的质因子。在所有没有打标记的 \(n\) 的因子 \(d\) 中如果 \(d\mid d_k\) 则合法,找到最小的。这部分复杂度是 \(n\) 的因子个数乘质因子个数。
总复杂度是 \(O(\sqrt n+k\log n+d(n)w(n))\)。
P3543 [POI 2012] WYR-Leveling Ground
记 \(d=\gcd(a,b),A=\frac a d,B=\frac b d\),区间操作转化为差分数组 \(d_i=a_i-a_{i-1}\),若 \(d\nmid d_i\) 则无解,否则问题即为构造两个序列 \(x_i,y_i\) 满足 \(\sum x_i=0,\sum y_i=0,ax_i+by_i=d_i\),求 \(\frac 1 2\sum|x_i|+|y_i|\) 的最小值。
先对于每个 \(d_i\) 找到满足 \(ax_i+by_i=d_i\) 且 \(|x_i|+|y_i|\) 最小的解,此时这是答案的下界,但不一定合法。
考虑调整,特解形式为 \((x+kB,y-kA)\),调整的代价只会在 \(x,y\) 改变正负号时增加,其余时刻不变,所以每次取调整代价最小的尽可能的调整,最多调整 \(2n\) 次。
CF516E Drazil and His Happy Friends
令 \(d=\gcd(n,m)\),只有所有标号对 \(d\) 同余的点会有关系。按 \(\bmod \ d\) 分组,有解当且仅当每组内初始存在人是快乐的。所以 \(d\) 如果大于 \(2\times 10^5\) 必定是无解。
对于一组分别计算最后一个男生女生的快乐时间取 \(\max\),两种情况对称,只考虑女生。
如果女生 \(i\) 在 \(x\) 天快乐,那么 \((i+n)\bmod m\) 在 \(x+n\) 天时一定快乐。此时可以连边 \((i,(i+n)\bmod m,n)\),初始如果男生 \(i\) 快乐连边 \((S,i\bmod m,i)\),初始如果女生 \(j\) 快乐则连边 \((S,j,j)\),最短路即为答案。
注意到点数太多,发现 \(i\to (i+n)\bmod m\) 的边将组内所有女生连成一个环,环上有一些起始点,那么每个起始点的前一个点可能影响答案,其它点都无法对 \(\max\) 造成影响,只保留这些关键点点数是可接受的。求最短路的值可以 exgcd。
P5598 【XR-4】混乱度
\(f(l,r)=f(l,r-1)\times \binom{S(l,r)}{a_r}\)。发现 \(f(l,r)\) 是连乘,在固定 \(l\) 时如果 \(\binom{S(l,i)}{a_i}=0\) 则 \(f(l,j)=0(j\geq i)\)。
考虑 Lucas 定理求 \(\binom n m\) 时实际在做的事情,将 \(n,m\) 在 \(p\) 进制下分解为 \(n_0n_1\cdots\) 和 \(m_0m_1\cdots\),答案是 \(\prod \binom{n_0}{m_0}\)。随着 \(r\) 和 \(S(l,r)\) 的增加,\(\binom{S(l,r)}{a_r}\) 第一次为 0 的位置就是 \(S(l,r)=S(l,r-1)+a_r\) 第一次在 \(p\) 进制下进位的位置。
固定 \(l\) 之后,对于一段 \(a_r\) 都是 0 可以直接跳过 \(f(l,r)\) 不变,否则至少会在某一位增加 1,最多增加 \(p\log_pV\) 次就会进位。
求大组合数的方法也是将 \(a_r\) 的每一位拆出来只考虑不为零的位置,分别算组合数相乘,每有个不为零的位置下一个 \(S\) 的这一位至少增加一,所以复杂度是 \(O(np\log_p V)\)。
第六课 构造基础
CF618F Double Knapsack
将选子集若化为选子段,令 \(sa_i,sb_i\) 表示 \(a,b\) 的前缀和,需要选出 \((l,r],(L,R]\) 使得 \(sa_r-sa_l=sb_R-sb_L\)。
假设 \(sa_n<sb_n\),否则是对称的。对于每个 \(sa_i\) 找到最小的 \(j\) 使得 \(sb_j\geq sa_i\),这样的 \(j\) 一定存在。由于 \(a_i,b_i\in[1,n]\) 所以 \(sb_j-sa_i\in[0,n)\)。由于 \((i,j)\) 共有 \(n+1\) 对,根据鸽巢原理定有重复值,找到分别当做 \((r,R),(l,L)\) 即可。
[ARC122E] Increasing LCMs
考虑 \(a_i\) 能作为末尾当且仅当 \(\gcd(a_i,{\rm lcm}_{j\not = i}(a_j))<a_i\),转化为 \({\rm lcm}_{j\not =i}(\gcd(a_i,a_j))<a_i\)。
一个数一旦合法之后在后续任意时刻都是合法的,所以每次从所有合法的数中找任意一个填到末尾都不影响后续。
CF1019C Sergey's problem
遍历一遍所有点,每次如果这个点被标记就不选,否则选并标记其可达点。
倒序遍历一遍第一次选出的点,如果被标记就不选,否则选并标记其可达点,此时选出点即为答案。注意两次的标记独立。
证明考虑第一次遍历完之后对于条边 \(u\to v\) 不可能两点都不被选,而且两点都被选当且仅当先遍历 \(v\) 后遍历 \(u\)。此时所选点为一个 DAG 森林,且任意点均能从所选点一步内抵达。
那么一个合法答案即为对 DAG 分层黑白染色即可,故倒序遍历所有点。此时选出的点一定是独立集,且由于任意点能从 DAG 一步内抵达,则黑白染色后能从所选点两步抵达。
CF1270G Subset with Zero Sum
由于 \(i-n\leq a_i\leq i-1\),所以 \(1\leq i-a_i\leq n\)。
连边 \(i\to i-a_i\),得到内向基环森林,对于任意一个环的所有点都是一个答案。
证明为对于一个点集 \(S\) 如果成环那么 \(\sum_{i\in S} i=\sum_{i\in S} i-a_i= \sum_{i\in S}i-\sum_{i\in S}a_i\),显然 \(\sum_{i\in S}a_i=0\)。
第七课 最小生成树 最短路2
P4156 [WC2016] 论战捆竹竿
对于一个字符串 \(s\),记 \(|s|=n\),有结论:
- \(s[1:k]\) 为 \(s\) 的 border,等价于 \(n-k\) 是 \(s\) 的周期。
根据 border 的定义,\(s[1:k]=s[n-k+1,n]\),所以对于任意 \(i\) 有 \(s_i=s_{i+n-k}\),则 \(k\) 是 \(s\) 的周期。反过来证也同样容易。
- 如果 \(p,q\) 是周期 \(p+q\leq n\) 则 \(\gcd(p,q)\) 是周期。
不妨设 \(p>q\),有 \(s_i=s_{i+p}=s_{i+p-q}\) 但是有可能 \(i+p>n\),此时要用 \(s_i=s_{i-q}=s_{i-q+p}\),所以如果 \(p+q\leq n\) 则 \(p-q\) 也是周期。根据辗转相除 \(\gcd(p,q)\) 是周期。
考虑两个 \(s\) 的 border \(s[1:a],s[1:b]\),其中 \(s[1:b]\) 为 \(s\) 除本身外最长的 border,\(a\geq \frac n 2\)。
令 \(p=n-a,q=n-b\),则 \(\gcd(p,q)\) 为 \(s\) 周期,又因为 \(s[1:b]\) 为最长 border,所以 \(\gcd(p,q)=q\) 即 \(q\mid p\)。
那么每个 \(p\) 都有 \(p=x\times q\),而且 \(q\) 是周期则 \(y\times q\) 也是周期,所以所有长度至少一半的 border 构成一个等差数列。
对于 \(s\) 的任意两个 border \(A,B(|A|<|B|)\),都有 \(A\) 是 \(B\) 的 border。所以将所有 border 按长度是否至少一半分为两个集合,至少一半的构成一个等差数列,其余的字符串为其中最长字符串的 border 可以递归。
因此有结论,一个字符串的所有 border 按长度排序后,可以将其划分为 \(\log\) 个子段,每段是等差数列。
题意转化为 \(\sum_{i=1}^{cnt} a_ix_i\) 在 \([0,w-n]\) 中能取到值的个数,其中 \(a_i\) 为 \(|s|\) 的所有周期。
使用同余最短路。直接做 \(\min(a_i)\times cnt\) 为 \(O(n^2)\),考虑将每个等差数列分开做。
对于一个等差数列 \(x+kd\),在 \(\bmod\ x\) 下跑 同余最短路。\(i\to i+d\) 形成 \(\gcd(x,d)\) 个环,每个环分开做。
环上最小的点不会被更新,从这里断开变成链,因为 \(k\) 取值是一个前缀,单调队列优化即可。
如何在不同模数间转换同余最短路,假设模数从 \(x\) 变成 \(y\),考虑 \(dis_i\) 表示 \(dis_i+kx\) 都可以取到,这也相当于一个等差数列,用 \(dis_i\) 在 \(\bmod\ y\) 意义下更新对应点,每个点连边 \(i\to i+x\) 即可,此时 \(k\) 取值任意不用单调队列。
P6199 [EER1] 河童重工
对一棵树点分治,设 \(i\) 到分治中心的举例为 \(dep_i\),可以认为 \((x,y)\) 的边权为 \(dist_1(x,y)+dep_x+dep_y\),因为真实的边权一定小于等于这个值而且会被考虑到所以不影响答案。
将当前分治连通块的点在另一颗树中建立虚树,对于每个点 \(x\) 找到虚树上 \(dist_1(x,y)+dep_y\) 最小的 \(y\),记为 \(pre_x\),\(dist_1(x,y)+dep_y\) 记为 \(dis_x\),这可以通过换根 DP 求出。那么对于虚树上每条边 \((u,v,w)\) 在最终边集中加入 \((pre_u,pre_v,dis_u+dis_v+w)\),除此之外的边一定不会在最终答案中出现。
这样一共会加入 \(O(n\log n)\) 条边,对这些做最小生成树即可。
P4208 [JSOI2008] 最小生成树计数
考虑 kruskal 的过程,从小到大枚举边权。对于当前边权的每条边 \((u,v)\),如果 \(u,v\) 已经被更小权值的边合并到一个连通块中则不考虑,剩下的所有边会合并若干连通块。
对于每一群最终合并成一个连通块的连通块,对他们之间求生成树个树,因为每个生成树的选边方案都保证最小且不影响其余边的选择,并把它们缩成一个连通块。对于不同群和不同边权的方案相乘即可。
P9926 [NFLSPC #6] 所以 k 小生成树怎么做?
回想求次小生成树的方法是,由最小生成树加入一条非树边并删除一条路径上边权最大的树边得到。
对于一棵最小生成树,求出增加量最小的非树边,对于这条边,如果选了则给出了一颗新的生成树,否则这条边强制未来再不能选,然后考虑增量次小的非树边是否选择。
一条边有四种状态,是否是树边,和能不能改变当前状态。初始所有边可以改变状态,对于一个生成树,如果抉择当前非树边不加入,则它的状态变为非树边且不可改变,如果抉择加入则在新的生成树中它的状态为树边且不可改变。
实际上在做的事情是,每次抉择一条边选不选即把后续的生成树分成包含或不包含这条边两部分,然后在包含的部分中继续分是否同时包含这条和另一条,在不包含的部分中再分出包含次小边的部分……
把所有生成树放到堆中取出 \(k\) 次求得 \(k\) 小生成树。
堆中对于每个生成树不需要即时存储具体形态,因为每个生成树是原来的生成树改变某一条边得到的,可以将这条边记录下来,当堆取出这个状态时再 dfs 求具体形态。对于每个状态不需要直接求出它的 \(O(m)\) 个后继生成树,当前一个被取出时在插入下一个后继即可。
复杂度 \(O(m\log m+mk\alpha(n)+k\log k)\)。
第二十课 网络流
P3980 [NOI2008] 志愿者招募
连边 \((i,i+1,inf-a_i,0)\),\((s_i,t_i+1,inf,c_i)\) 求最小费用最大流。
第二种边上每一个流量就表示将 \([s_i,t_i]\) 覆盖一遍。对于第 \(i\) 个点最多只能流过 \(inf-a_i\),要求最大流是 \(inf\),那么剩下的流量只能由 \(s_j\leq i\leq t_j\) 的第二类边补全,则第 \(i\) 个点至少被覆盖 \(a_i\) 次。
P3227 [HNOI2013] 切糕
令 \((a,b)\) 为第 \(a\) 条链第 \(b\) 个点。
连边 \(((a,b),(a,b+1),v_{a,b})\),\((S,(a,1),inf)\),\(((a,m),T,inf)\)。
对于相邻两条链 \(x,y\) 连边 \(((x,z),(y,z-D),inf)\)。
以割断边 \((a,b)\to (a,b+1)\) 表示切糕中选点 \((a,b)\)。如果相邻链选点为 \(x,y(x<y-D)\) 则有路径 \(S\to y\to y-D\to T\),所以第四类边保证了合法割满足 \(D\) 的性质。
P8215 [THUPC 2022 初赛] 分组作业
首先 \(c_i,d_i,e_i\) 是集合划分,记 \(tr_i\) 表示和 \(i\) 同组的人,连边 \((S,i,d_i)\),\((i,T,c_i)\),\((i,tr_i,e_i)\)。
然后考虑如何表示合作关系,对于每组新建一个点 \(x\),如果 \(x\) 有流量经过表示组内合作。由于合作必须两人都愿意,所以连边 \((x,i,inf)\),\((x,i+1,inf)\),如果 \(x\) 有流量则必须割掉 \(c_i,c_{i+1}\)。
然后考虑喜欢关系,记 \(v_i\) 表示人 \(i\) 对应的表示组合作的点,考虑一个喜欢关系 \((x,y)\)。
- 如果 \(x\) 没有合作但 \(y\) 愿意,即 \(y\) 有流量且 \(v_x\) 没有流量的时候会产生 \(a\) 的代价,所以连边 \((y,v_x,a)\) 表示限制如果想达成上述流量情况必须付出 \(a\) 的代价。
- 如果 \(x\) 不愿意且 \(y\) 合作,即 \(x\) 到汇点的边没有被割且 \(v_y\) 有流的时候有 \(b\) 的代价,所以连边 \((v_y,x,b)\) 限制次情况。
P3159 [CQOI2012] 交换棋子
白棋看做没棋,问题变成初末状态黑棋两两匹配。所以可以把初末状态都是黑棋的也看做没有,问题变为黑棋两两匹配,对于路径上点,始末两点交换一次,中间点交换两次。
将两次交换看做单位流量,拆点 \(in_i,out_i\) 之间的流量限制交换次数,特殊的始末两点如果允许奇数次交换则多一个流量。
- \(S\) 向每个初始黑棋格 \(x\) 连 \((S,x,1,0)\)。
- 每个终止黑棋格 \(y\) 向 \(T\) 连 \((y,T,1,0)\)。
- \(in_i,out_i\) 之间按上述连边,容量是交换次数的一半(加一),费用是 \(0\)。
- \(out_i\) 向八连通 \(in_j\) 连 \((out_i,in_j,inf,1)\)。
最小费用最大流。
P4003 [清华集训 2017] 无限之环
考虑如何判断一个管道图是否合法。将网格黑白染色,每个网格建四方向接口,白色网格中心是出水口,黑色中心是入水口,沿管道方向连接相应接口,合法等价于满流。
按初始管道连费用为零边,旋转管道表现为在不同接口之间连费用为一或二的边。最小费用最大流。
CF1383F Special Edges
\(k\) 很小,考虑 \(2^k\) 枚举 \(S\) 集合中的边不割,对于每个 \(S\) 求得其余边的割断状态,则求答案是容易的。
但是显然不能跑 \(2^k\) 遍 dinic。所以做法是发现可以从 \(S\) 的子集 \(T\) 跑完网络流的残量网络上加边,跑出 \(T\) 到 \(S\) 的增量。那么就可以每次对于 \(S\) 从删去 lowbit 的状态加一条边跑残量网络转移过来。(跑 EK 比 dinic 快)
P8291 [省选联考 2022] 学术社区
记 \(0/1/2\) 表示楼下、楼上、学术三种类型的消息。
考虑没有楼上怎么做。对于一条消息 \((A,B,0)\) 连边 \(B\to A\),对于一条学术消息放在发出者对应的节点上。合法方案由若干条学术消息开始的链构成,对图进行边覆盖。考虑建超级源点 \(T\) 向学术消息连边,入度多的点向 \(T\) 连边,运行欧拉回路。
问题在于有些点入度小于出度,这些额外的边一定无法满足,其余的边容易欧拉回路构造方案。
如果同时有三种消息,每条链一定是若干条楼上消息+中间一条学术消息+若干条楼下消息(若干可以是零)。建立二层图 \(G_1,G_2\),对于 \((A,B,1)\) 在 \(G_1\) 中连边 \(A\to B\);\((A,B,0)\) 在 \(G_2\) 中连边 \(B\to A\);\((A,B,2)\) 连边 \(G_1(A)\to G_2(A)\)。
同上建立超级源点 \(T\),\(T\) 向 \(G_1\) 连边,\(G_2\) 向 \(T\) 连边,平衡出入度运行欧拉回路。
现在有平衡不了的点比如 \(G_1\) 中入度大于出度的,\(G_2\) 反之,那么有了一个答案下界。考虑能不能把一些不是学术的消息发挥学术作用,使得答案增加。
如果舍弃一条 \((A,B,1)\),导致 \(G_1(A)\to G_1(B)\) 变成 \(G_1(A)\to G_2(A)\),此时\(G_1(B)\) 入度减少 1,\(G_2(A)\) 入度增加 1,如果这两个点在开始的时都需要舍弃边,这样可以使得答案下界抬升 1。容易使用二分图多重匹配刻画,求最大流即可。
对于 \((A,B,0)\) 和 \((B,A,1)\) 同时出现的情况可以事先将这两条消息缩起来,然后运行上述算法。

浙公网安备 33010602011771号