2024.3.23 - 3.29

Sat

ABC346

A. 模拟即可。
B. Copy多次模式串,然后枚举。
C. 用 set 等模拟即可。
D. 记使得前后缀交替出现的 \(2\) 种情况的最小代价,然后求最小值。
E. 倒序进行所有操作。
F. 二分答案,然后计算每匹配一个字符将会到达 \(S\) 的第几个副本与匹配位置。

Sun

Lcm

多次给定 \(n,m\),求:

\[\overset{n}{\underset{i=1}{\sum}} \overset{m}{\underset{j=1}{\sum}} |\mu(\gcd(i,j))| \operatorname{lcm}(i,j) \]

\(T\leq 10^4, n,m\leq 4\times 10^6\)


首先,\(|\mu(x)|=\mu^2(x)\),故有:

\[\begin{aligned} & \overset{n}{\underset{i=1}{\sum}} \overset{m}{\underset{j=1}{\sum}} |\mu(\gcd(i,j))| \operatorname{lcm}(i,j) \\ =& \overset{n}{\underset{i=1}{\sum}} \overset{m}{\underset{j=1}{\sum}} \mu^2(\gcd(i,j)) \operatorname{lcm}(i,j) \\ =& \overset{n}{\underset{d=1}{\sum}} \mu^2(d) \overset{n}{\underset{i=1}{\sum}} \overset{m}{\underset{j=1}{\sum}} \operatorname{lcm}(i,j)[\gcd(i,j)=d] \\ =& \overset{n}{\underset{d=1}{\sum}} d\mu^2(d) \overset{n/d}{\underset{i=1}{\sum}} \overset{m/d}{\underset{j=1}{\sum}} ij[\gcd(i,j)=1] \\ =& \overset{n}{\underset{d=1}{\sum}} d\mu^2(d) \overset{n/d}{\underset{k=1}{\sum}} \mu(k)k^2 \overset{n/dk}{\underset{i=1}{\sum}} \overset{m/dk}{\underset{j=1}{\sum}} ij \\ =& \overset{n}{\underset{d=1}{\sum}} d\mu^2(d) \overset{n/d}{\underset{k=1}{\sum}} \mu(k)k^2 S(\lfloor{\frac{n}{dk}}\rfloor) S(\lfloor{\frac{m}{dk}}\rfloor) \\ =& \overset{n}{\underset{T=1}{\sum}} S(\lfloor{\frac{n}{T}}\rfloor) S(\lfloor{\frac{m}{T}}\rfloor) \underset{k\mid T}{\sum} k^2\mu(k) (\frac{T}{k}) \mu(\frac{T}{k}) \\ =& \overset{n}{\underset{T=1}{\sum}} S(\lfloor{\frac{n}{T}}\rfloor) S(\lfloor{\frac{m}{T}}\rfloor) (T\underset{k\mid T}{\sum} k\mu(k)\mu(\frac{T}{k})) \end{aligned} \]

\(f(x) = \underset{k\mid x}{\sum} k\mu(k)\mu(\frac{x}{k})\),欲筛 \(f(x)\),有:

\[f(x)= \begin{cases} 1 &(x=1) \\ 1-x &(x\in \mathbb{P}) \\ -x &(\exists p\in \mathbb{P}, p^2=x) \\ \end{cases} \]

时间复杂度为 \(\mathcal{O}(T\sqrt{n})\)

实力派

给定 \(n\) 个正整数 \(a_i\),对于每一个 \(k\in [1,n]\) 求:

  • 有多少种在这 \(n\) 个数中选择 \(k\) 个使得选出来的数字的 \(\gcd\)\(1\)
  • 所有在这 \(n\) 个数中选择 \(k\) 个数的 \(\gcd\) 的和。

不能选择相同下标的数,但选出的数字权值可以相同。

\(n\leq 2\times 10^5, a_i\leq 10^6\)


首先列出表达式,先看第一问:

\[\begin{aligned} & \underset{1\leq i_1 < i_2 < \cdots < i_k \leq n}{\sum} [\gcd(a_{i_1},a_{i_2},\cdots,a_{i_k})=1] \\ =& \overset{V}{\underset{d=1}{\sum}} \mu(d) \underset{1\leq i_1 < i_2 < \cdots < i_k \leq n}{\sum} [d\mid \gcd(a_{i_1},a_{i_2},\cdots,a_{i_k})] \\ \end{aligned} \]

后面的求和相当于在 \(d\) 的倍数中选择 \(k\) 个,组合数即可。

再看第二问:

\[\begin{aligned} & \underset{1\leq i_1 < i_2 < \cdots < i_k \leq n}{\sum} \gcd(a_{i_1},a_{i_2},\cdots,a_{i_k}) \\ =& \overset{V}{\underset{d=1}{\sum}} \varphi(d) \underset{1\leq i_1 < i_2 < \cdots < i_k \leq n}{\sum} [d\mid \gcd(a_{i_1},a_{i_2},\cdots,a_{i_k})] \\ \end{aligned} \]

同理求得答案。

时间复杂度为 \(\mathcal{O}(nd(V))\)

Bessie's Interview (S)

【USACO2024 Open】

\(k\) 个 Farmer 将要采访 \(n\) 头 Cow,各 Cow 有采访耗费时间,初始时 Farmer \(i\) 采访 Cow \(i\),当一个 Farmer 结束采访后,他将采访第一个没被采访过的 Cow,每个 Cow 将在所有可用的 Farmer 中任意选择一个并接受其采访,若 Bessie 的编号为 \(n+1\),求它开始采访的最早时间与可用 Farmer。

\(k\leq n\leq 3\times 10^5\)


首先可以用堆求出每一个 Cow 的最早采访时间,以及可以转移到这个时间的时间,这将构成一张图,将所有用于更新的时间点进行记录并以此建图。

在这张图上面进行 bfs 就可以知道能够在最短时间内采访 Bessie 的所有 Farmer。

时间复杂度为 \(\mathcal{O}(n\log_2 k)\)


附:更新所用的时间可以直接用于建图。

lzqy_ の Strings Round

好奇心宝贝

给定一个 \(n\times m\) 的字符矩阵,在其中找出两条从左上到右下的路径,记两条路径依次形成的字符串为 \(S,T\),最小化 \(\operatorname{LCP}(S,T)\) 的长度。

\(n,m\leq 2\times 10^3\),字符为小写字母。


若存在一个点(不在最右边或最下边),它下方与右方的格子上的字符,那么可以将两条路径都引到这里然后分叉。

求一个最小值即可,时间复杂度为 \(\mathcal{O}(nm)\)

漫长悄悄话

\(S\) 为字符串,\(n\)\(S\) 的长度,\(S^R\) 表示 \(S\) 的反串,\(\operatorname{LCP}(S,T)\)\(\operatorname{LCS}(S,T)\) 分别表示最长公共前后缀。

\(p_i,s_i\) 分别表示 \(S\) 中第 \(i\) 个位置开始的前后缀,最大化 \(\operatorname{LCP}(\operatorname{LCP}(s_i,s_j),\operatorname{LCS}(p_i,p_j)^R)\) 的长度。

\(n\leq 10^6\),且 \(S\) 中仅存在小写字母。


显然,原题等价于求 \(\operatorname{LCP}(s_i,s_j,s^R_{n-i+1},s^R_{n-j+1})\) 的最大长度,其中 \(p^R_i,s^R_i\)\(p_i,s_i\) 类似,只不过母串为 \(S^R\)

那么显然可以先确定 \(\operatorname{LCP}(s_i,s^R_{n-i+1})\),哈希一手解决,记为 \(L_i\)

然后二分答案,设当前需要 check 的值是 \(k\),那么要求 \(L_i\ge k\),然后判断是否有一个 Hash 值出现至少两次,开个 map 即可,或者再 Hash 一次。

笔者时间复杂度为 \(\mathcal{O}(n\log_2^2 n)\)

在四方城外

给定长度为 \(n\) 的字符串 \(S\),每一次操作在 \(S\) 末尾追加 \(S\) 的最长真 Border,记 \(f(x)\) 表示 \(x\) 次操作后 \(S\) 的长度,给定 \(L,R\),求:

\[\overset{R}{\underset{i=L}{\sum}} f(i) \]

\(n\leq 10^6, 1\leq L\leq R\leq 10^9\)


分情况讨论:

  • 如果原串没有 Border,则答案为 \((R-L+1)n\)

  • 如果原串由 \(t\) 个完整的循环节组成,则一次操作后变为 \(2t-1\),两次操作后变为 \(2(2t-1)-1\),显然可以列出式子为 \((2^{R+1}-2^L)(t-1) + (R-L+1)\)

  • 否则,将 Border 进行循环节拆分,假设前缀有 \(a\) 个循环节(可能到 Border 之后),后缀有 \(b\) 个,显然是要么乘以 \(2\),要么加上 \(a\),暴力乘 \(2\) 到加上 \(a\) 的部分即可。

时间复杂度为 \(\mathcal{O}(n)\)


附:居然有人用 1999 的心相做题目名和背景。

Mon

LGV引理初探

基本定义
双射构造

Painting Fence Posts (S)

【USACO2024 Open】

给定一个 \(n\) 个顶点的多边形 \(P\)\(P\) 中相邻两条边互相垂直且所有边平行于坐标轴,\(Q\) 个询问,每个询问给出多边形上互异两点,标记两点间较短路径经过的所有顶点,求各顶点的标记数量。

\(n,Q\leq 2\times 10^5\),且 \(n\) 是偶数。


首先,在同一 \(x\) 坐标上的所有点,按照 \(y\) 升序,一定是第一个点与第二个点间有边、第三个点与第四个点间有边……同一 \(y\) 坐标同理,于是可以确定多边形。

将多边形确定后,把所有询问点离线,可以确定点在多边形上的位置(这里是难点,实现难度较高)。

然后一个差分确定所有点的标记数量。

路径交点

【NOI2021】

\(k\) 层的分层图 \(G\),第 \(i\) 层有 \(n_i\) 个点,仅相邻两层有边,每一层的点从上到下按编号升序排布,对于一组路径,从第 \(1\) 层节点到第 \(k\) 层节点,各点仅出现一次,并记其交点数量为 \(I(P)\),求 \(I(P)\) 为偶数的 \(P\) 的数量与 \(I(P)\) 为奇数的 \(P\) 的数量之差。


首先求出第一层点 \(i\) 到第 \(k\) 层点 \(j\) 的方案数,然后直接套用 LGV 引理即可。

正确性只需要证明这仅关于起点与终点的对应关系,一个交点交换一对数字造成逆序对奇偶性改变,故结论成立。

网络流再探

网络流理论篇

网络流应用篇

The "Winning" Gene (S)

【USACO2024 Open】

给定一个长度为 \(n\) 的字符串 \(S\),定义 \(f(K,L)\) 为所有长度为 \(K\) 小的连续子串中,每一个子串所有长度为 \(L\) 的子串中字典序最小的子串位置的不同种类数。

将所有数对 \((K,L)\) 按照 \(f(K,L)\) 进行分类。

\(n\leq 3000\)


性质题,反正我不太会。

首先,简单的,暴力计算,时间复杂度为 \(\mathcal{O}(n^5)\)

不妨对每一个位置 \(i\) 考虑贡献,假设枚举长度 \(L\),那么有哪一些 \(K\) 有贡献呢?

不妨令 \(a_i\) 表示最大的满足 \(S_{[a_i,a_i+L)}\leq S_{[i,i+L)}\) 的位置,令 \(b_i\) 表示最小的满足 \(S_{[b_i,b_i+L)} < S_{[i,i+L)}\) 的位置,且需要 \(a_i < i < b_i\),由于下标的大小关系进行取等判定。

那么显然这个长度为 \(K\) 的区间不能包含 \([a_i,a_i+L)\)\([b_i,b_i+L)\) 这两段区间,而在它们中间,满足 \(K\in [L,b_i+L-2-a_i]\) 的一段。

而具体,如何确定 \(a_i,b_i\) 呢?首先比较 \(S\) 中两个子串可以用 LCP 来确定大小,可以做到 \(\mathcal{O}(n^2)\) 预处理与 \(\mathcal{O}(1)\) 查询。

发现 \(a_i\) 随着 \(L\) 的上升而下降,证明:

若其不成立,则存在 \(L_1 < L_2\)\(S_{[a_i,a_i+L_1)}\leq S_{[i,i+L_1)}, S_{[a_i,a_i+L_2)} > S_{[i,i+L_2)}\),而偏序关系不会因为在后面追加字符而改变,所以此时矛盾,故原命题成立。

同理 \(b_i\) 随着 \(L\) 的上升而下降,随着 \(L\) 的下降而上升。

用一个指针维护即可,总时间复杂度为 \(\mathcal{O}(n^2)\),统计答案先差分一下,然后复杂度也是 \(\mathcal{O}(n^2)\)

Tue

Drainage Ditches

【USACO】

给定一排水系统,求排水最大流量。

\(n,m\leq 200\)


模板题。

新年聚会

Kaho 和 Suzune 邀请了一些朋友来她们家参加新年聚会,共计 \(n\) 个人,以及 \(m\) 种菜肴。大家希望聚会上的菜肴数量越多越好,但是同种菜肴的数量有一个上限 \(r_i\)。每个人最多携带 \(k\) 种菜品。第 \(i\) 个人可以携带部分菜品,每个人最多携带一份同种菜品,问菜肴数量的最大可能值。

\(n\leq 200,m\leq 100, k\leq 5\)


首先,建立超源 \(S\) 与超汇 \(T\),则:

  • \(S\) 向所有人连边,容量为 \(k\),表示每个人最多携带多少菜品。

  • 所有人向他们可以携带的菜品连边,容量为 \(1\),表示每个人可以携带的菜品,最终流量每个人携带菜品的一种可行决策。

  • 所有菜品向 \(T\) 连边,容量为 \(r_i\),表示每种菜品的数量限制。

\(S\to T\) 的最大流表示问题的答案。

Dining

【USACO2007 Open】
Kaho 和 Suzune 邀请了一些朋友来她们家参加晚宴。共计 \(n\) 个人,\(f\) 种食物,\(d\) 种饮品,每个人有喜欢的食物与饮品,每种食物与饮品限 \(1\) 份,称满足一个人的要求为他得到了自己喜欢的食物中的一种与自己喜欢的饮品中的一种,且一个人不能选择多种饮品或多种食物,问最多满足多少人的要求。


首先,建立超源 \(S\) 与超汇 \(T\),则:

  • 将所有人进行拆点,中间的流量为 \(1\),表示每个人最多选择某饮品与食物各 \(1\) 种。

  • \(S\) 向所有食物连边,容量为 \(1\),表示每种食物限 \(1\) 份。

  • 所有食物向喜欢这个食物的人的入点连边,所有喜欢某种饮品的人的出点向该饮品连边,建立喜好关系。

  • 所有饮品向 \(T\) 连边,容量为 \(1\),表示每种饮品限 \(1\) 份。

\(S\to T\) 的最大流表示问题的答案。

方格取数

给定 \(n\times m\) 的矩阵,选择不相邻的若干个数,最大化选出的数字的和。

\(n,m\leq 100\)


首先,这是一张二分图,因为矩阵可以黑白染色,且有左部点与右部点,那么左部点与右部点不能同时选择。

考虑最小割:

建立超源 \(S\) 与超汇 \(T\),则:

  • \(S\) 向所有左部点连边,边权为对应点权,割该条边表示不选该点。

  • 所有右部点向 \(T\) 连边,边权为对应点权,割该条边表示不选该点。

  • 所有左部点向相邻右部点连边,边权为无穷大,表示两个点间有互斥关系。

    • 因为是最小割,在本题中删去这些边没有任何意义,边权设为无穷大直接表示这些边不能割。

由于最小割,跑出来的结果,即 \(S\)\(T\) 不连通,此时不会有选出来互斥的数字。

  • 假设有互斥的数字,则一定满足:这两个点向 \(S\)\(T\) 的边没删,且中间有一条边,根据最小割的定义,这不是“割”,矛盾。

故最小割为本题答案,且有最小割等于最大流。

士兵占领

给定一个 \(n\times m\) 的矩阵,部分位置有障碍,你需要在无障碍的格子上放置棋子,使得第 \(i\) 行的棋子数量不小于 \(R_i\),第 \(j\) 列的棋子数量不小于 \(C_j\),问最少放置的棋子数量。

\(n,m\leq 100\)


无解先判掉。

原问题等价于先放满,然后取走最多数目的棋子且满足条件,那么:

首先,建立超源 \(S\) 与超汇 \(T\),则:

  • \(S\) 向所有行连边,容量为 \(r_i\),表示该行能拿走的最多棋子数量。

  • 若一个格子 \((x,y)\) 不是障碍,则它可以放置棋子,将第 \(x\) 行向第 \(y\) 列连一条边,容量为 \(1\),表示可以取走这个棋子。

  • 所有列向 \(T\) 连边,容量为 \(c_i\),表示该列能拿走的最多棋子数量。

最大流等于能取走的最多棋子数量。

蜥蜴

若干蜥蜴在石柱上来回行动,每只蜥蜴可以移动到欧几里得距离不超过 \(d\) 的石柱上,每根石柱有经过次数限制,问最少无法离开的蜥蜴数量。

\(n,m\leq 20, d\leq 4, h\leq 3\)


显然可求最多离开的蜥蜴数量。

首先,建立超源 \(S\) 与超汇 \(T\),则:

  • \(S\) 向所有有蜥蜴的石柱的入点连边,容量为 \(1\),表示可以选择解放这只蜥蜴。

  • 所有石柱拆点,入点连出点,容量为次数限制,表示最多可以经过的次数。

  • 所有可以到达的石柱,一个出点连另一个入点,容量为正无穷,表示这条路可走。

  • 所有可以离开的石柱的出点连向 \(T\),容量为正无穷,表示成功解放。

最大流等于最多离开的蜥蜴数量。

最长不下降子序列问题

给定一个长度为 \(n\) 的序列,求:

  1. 该序列的 LNDS(最长不下降子序列)的长度。

  2. 该序列中最多可以同时取出多少个 LNDS。

  3. \(a_1,a_n\) 可以重复取出,该序列中最多可以同时取出多少个 LNDS。

\(n\leq 500\)


第一问显然 DP 可求,答案为 \(k\)

第二问:

建立超源 \(S\) 与超汇 \(T\),则:

  • \(S\) 向所有 \(f_i=1\) 的点连边,容量为 \(1\),表示可以从此处开始 LNDS。

  • 所有点拆点,入点连出点,容量为 \(1\),表示该点只能同时取出一次。

  • \(f_j + 1 = f_i\)\(a_j\leq a_i\),则连接 \(j\) 的出点与 \(i\) 的入点,容量为 \(1\),表示可以按照此方法连接。

  • 所有 \(f_i = k\) 的点的出点连向 \(T\),容量为 \(1\),表示可以从此处结束 LNDS。

第三问:

先特判 \(k=1\) 的情况,在第二问的基础上取消 \(1\) 号点与 \(n\) 号点的流量限制即可。

Wed

网络吞吐量

【CQOI2015】

\(1\) 号点发送信息到 \(n\) 号点,各点有吞吐量上限(\(1\) 号与 \(n\) 号除外),各消息沿着最短路发送,求网络最大吞吐量。

\(n\leq 500, c_i\leq 10^9\)


与最长不下降子序列类似,只不过把 DP 的 \(f\) 数组换成最短路的 \(dis\) 数组,其余同理,如下:

  • \(1\sim n\) 号点拆点,入点连出点,容量为 \(c_i\),表示该点的最大吞吐量,特别的,\(c_1,c_n\) 应视为无穷大。

  • 记源点为 \(1\) 号点入点,汇点为 \(n\) 号点出点。

  • \(dis_j + w_{j,i} = dis_i\),则连接 \(j\) 的出点与 \(i\) 的入点,容量为正无穷,表示最短路可以过这条边。

最大流为网络最大吞吐量。

记得开大极大值。

危桥

【CQOI2014】

\(n\) 个点之间有边相连,有的边限制走 \(2\) 次,有的边不限,询问是否存在一种方案,可以来回往返 \(a,b\)\(c\) 次,同时来回往返 \(d,e\)\(f\) 次。

\(n\leq 50\)


首先,图很清楚,直接建边。

建立超源 \(S\) 与超汇 \(T\),给 \(a,b,d,e\) 限制最高流量,往返可以看作是双倍次数到达。

发现存在的问题:

  1. 有的流的方向是 \(a\to e, d\to b\)

  2. 我们可能同时经过一危桥 \(4\) 次。

交换 \(d,e\) 后再跑,两次最大流必须满流才有解,否则无解,证明详见题解。

T'ill It's Over

\(n\) 个初始为 \(1\) 的变量,给定 \(m\) 个操作,每次可以把一个值域位于 \([p,q]\) 的变量的值改成 \([s,t]\) 中的一个值,且最多使用 \(l\) 次,尽可能多的让变量的值等于 \(k\)

\(n\leq 10^7, m\leq 2\times 10^4, 1\leq k,l\leq 10^5, [p,q],[s,t]\subseteq [1,k]\),保证数据随机。


显然 \(n\) 是流量限制,不妨以值和操作进行图的构建。

每一个操作拆成入点和出点,为了保证操作的次数被限制。

将操作的限制值域连向入点,出点连向可达值域跑最大流,容量为 \(n\)

超源连接值为 \(1\) 的对应点,超汇连接值为 \(k\) 的对应点。

值域范围很大,采用线段树优化建图,其中 \(S_1\) 自底向上建边,\(S_2\) 自上往下连边,且 \(S_2\) 的对应点向 \(S_1\) 连边,每一个操作的入点与 \(S_1\) 中对应点连边,出点与 \(S_2\) 中的对应点连边即可,除去操作与源汇连接的点,其余边容量为无穷大。

理论时间复杂度为 \(\mathcal{O}(k^2m\log_2 k)\)

Destroying The Graph

【POJ2125】

给定一张图 \(G\),删除每个点的入边喝出边有特定代价,问删除 \(E(G)\) 全集的代价。

\(|V|\leq 100\)


考虑最小割:

每个点拆成入点和出点,分别表示删去该点的入边与出边。

超源连各边出点,各边入点连超汇,容量为其代价。

存在一条边 \(u\to v\) 就连 \(u\) 的出点与 \(v\) 的入点,容量为正无穷。

最小割即为答案。

善意的投票

【SHOI2007 / JLOI2010】

\(n\) 个人投票,每个人投支持或反对票,有 \(m\) 对朋友关系,请问在合理的投票方式下,与自己意愿不符的人数和投票不同的朋友对数之和的最小值?

\(n\leq 300\)


考虑最小割:

我们让一个点与超源相连,表示要求这个人持支持票;与汇点相连,表示要求这个人持反对票。

我们让一对人 \((u,v)\) 之间连 \(u\to v\) 的边,表示 \(u\) 要求 \(v\) 与之投票一致,一对朋友之间要求互相连边,不是朋友不连。

割掉其与超源/超汇的连边,表示其不持对应的票,解决自身的冲突。

割掉一对朋友之间的其中一条边,仅要求一个人与另一个人投票一致,解决朋友之间的冲突。

Thur

星际战争

【SDOI2015】

\(n\) 个怪物,血量为 \(a_i\),有 \(m\) 个武器,每个武器可以攻击一些特定的怪物,武器连续攻击,每秒对单只怪物造成 \(b_i\) 点伤害,求清怪的最短时间。

\(n,m\leq 50\)


二分时间,然后就可知每个武器所能造成的伤害。

超源连武器,超汇连怪物,容量分别为伤害和血量,判断最大流是否等于总血量即可。

劈配

【八省联考2018】

\(m\) 个导师的战队分别限 \(b_i\) 人,\(n\) 个选手分别在各档志愿上填写了导师的名字(可重可漏),各选手有期望录取志愿档 \(s_i\),选手的名次为编号,对各选手 \(i\) 依次求:

  • 若前 \(i-1\) 名选手都被最优的录取志愿档录取,那么该选手最优的录取志愿档。

  • 该选手需要至少前进多少名,才能使得该选手被 \(s_i\) 档以内的录取志愿录取。

\(n,m\leq 200\),各档志愿限制填写的导师不超过 \(C\) 个则 \(C\leq 10\),且 \(T\leq 5\)


带容量二分图匹配,魔改匈牙利即可。

具体的,每一次匹配都将“该点已被匹配”该为“该点匹配的点数已经达到容量上限”。

第二问直接二分上升名次求解,最好先记录前缀匹配的状态。

时间复杂度未知,但是跑得很快。

Not Too Many Balls

【ABC332G】

给定 \(n+m\) 个点,超源 \(S\) 连接左部 \(n\) 个点,容量为 \(a_i\),超汇 \(T\) 连接右部 \(m\) 个点,容量为 \(b_i\),左部 \(i\) 号点连右部 \(j\) 号点的容量为 \(ij\),求原图最大流。

\(n\leq 500, m\leq 5\times 10^5, 0\leq a_i,b_i\leq 10^{12}\)


正确性堪忧的做法:

将左部点按照 \(\dfrac{a_i}{i}\) 降序排序,然后先枚举右部点,再枚举左部点,贪心匹配即可。

正确解法:

DP 最小割。

详细做法先鸽了。

最小割

【ZJOI2011】

给定一张网络 \(G=(V,E)\),多次询问求有多少组无序点对的最小割不大于 \(x\)

\(T\leq 10, |V(G)|\leq 150, |E(G)|\leq 3000, q\leq 30\)


最小割树板子题,建出最小割树然后处理出任意两点间最小割。

二分点对数量均可,直接枚举说不定也行。

不同的最小割

【CQOI2016】

给定一张网络 \(G=(V,E)\),询问有多少种权值不同的最小割。

\(|V(G)|\leq 850, |E(G)|\leq 8500\)


建出最小割树,然后最小割只可能是树上的边权,去个重即可。

Juice Junctions

【CERC2015】

给定一张网络 \(G=(V,E)\),保证任意两点间最大流 \(\leq 3\),求所有无序点对的最大流之和。

\(|V(G)|\leq 3000, |E(G)|\leq 4500\)


最大流转最小割。

正确做法:

基于边双连通分量与三连通,每次割一条边建边双。

若初始时两点不在同一边双,则最小割为 \(1\)

若割掉某一条边后,两点不在同一边双,则最小割为 \(2\)

否则最小割为 \(3\)

Hash 一下割掉每一条边后某个点的边双编号。

时间复杂度为 \(\mathcal{O}(m^2+n^2+mn)\)

时间复杂度不太对的做法:

建最小割树。

小M的作物

给定 \(n\) 种农作物,两块无穷大耕地 \(A,B\),农作物 \(i\) 种在耕地 \(A\) 中的收益是 \(a_i\),种在 \(B\) 中的收益是 \(b_i\)

给定 \(m\) 个组合,每一个组合内有若干作物,将该组合内的所有组合种在同一块耕地中有额外收益,种在 \(A\) 中为 \(g_i\),在 \(B\) 中为 \(h_i\)

求最大收益。

\(n,m\leq 1000\)


考虑最小割:

作物 \(i\) 与超源连容量为 \(a_i\) 的边,与超汇连容量为 \(b_i\) 的边,割某条边表示不选择种在该耕地中。

组合比较难搞,但是类比作物,与超源连容量为 \(g_i\) 的边,与超汇连容量为 \(h_i\) 的边,割某条边表示不选择种在该耕地中。

考虑其与作物的关系,必须所有作物都与该组保持一致才合法,而任何一个不一致,都应该导致这条边被割。

由于组合的贡献方式有三种,仅用一个点无法有效描述,拆点分别表示收益在 \(A\) 与收益在 \(B\)

组合与作物之间的关系是捆绑的,所以在组合与作物间的边不能被割,所以容量为正无穷。

在此基础上,我们发现,如果该组合 \(i\) 中有一个作物 \(x\) 选择收益在 \(B\),那么存在路径 \(S\to g_i\to x\to T\) 的边,此时要割 \(S\to g_i\) 的边,符合我们的要求,收益在 \(A\) 同理。

跑最小割求出最小损失,则最大收益易求。

家园 / 星际转移问题

【CTSC1999】

给定 \(n\) 个车站,\(m\) 条带容量循环列车,将 \(k\) 个人从起点送到终点,问最小时间。

\(n\leq 15, m\leq 20, k\leq 50\)


首先用并查集判一下连通性,然后枚举答案(范围不大)。

答案每增加 \(1\),则新建一层图,然后将上一层与这一层对应连边,容量为正无穷。

将该答案时间下的有效列车转移建边,容量为车的容量。

则最大流 \(\ge k\) 的时间为答案。

文理分科

给定 \(n\times m\) 的矩阵,每个矩阵可以选定 \(0/1\),若选择 \(0\) 则增加 \(a_{i,j}\) 的权值,与之四连通的格子若全选 \(0\) 则额外增加 \(c_{i,j}\) 的权值;若选择 \(1\) 则增加 \(b_{i,j}\) 的权值,与之四连通的格子若全选 \(1\) 则额外增加 \(d_{i,j}\) 的权值。

在合适的选数下,最大权值是多少?

\(n,m\leq 100\)


类比小M的作物。

连超源表示选择 0,连超汇表示选择 1,限制之间连无穷大。

则可求最小损失,则最大收益易求。

Snack

【ARC125E】

给定一张网络 \(G=(V,E)\),其中超源连向左部 \(n\) 个点,容量为 \(a_i\),超汇连向右部 \(m\) 个点,容量为 \(c_i\),左部 \(i\) 号点连右部 \(j\) 号点的容量为 \(b_j\),求原图最大流。

\(|V(G)\setminus\{S,T\}|\leq 2\times 10^5, a_i,c_i\leq 10^{12}, b_i\leq 10^7\)


首先最大流转最小割,则原图最小割为:

\[\begin{aligned} & \underset{P\subseteq L, Q\subseteq R}{\min} \{\underset{i\in P}{\sum} a_i + \underset{i\in Q}{\sum} c_i + \underset{i\notin Q}{\sum} b_i(n-|P|)\} \\ =& \underset{P\subseteq L}{\min} \{\underset{i\in P}{\sum} a_i + \underset{i\in R}{\sum} \min(c_i, b_i(n-|P|))\} \\ \end{aligned} \]

然后解个不等式,有:

\[c_i\leq b_i(n-|P|) \implies \dfrac{c_i}{b_i}\leq n-|P| \]

枚举 \(|P|\),并将右部点按照 \(\dfrac{c_i}{b_i}\) 排序,则有一段前(后)缀取 \(c_i\),其余取 \(b_i(n-|P|)\),双指针维护,而左部点贪心取最小的一些即可。

时间复杂度为 \(\mathcal{O}(n\log_2 n + m\log_2 m)\),瓶颈在两数据的排序。

圈地计划

给定 \(n\times m\) 的矩阵,每个矩阵可以选定 \(0/1\),若选择 \(0\) 则增加 \(a_{i,j}\) 的权值,若选择 \(1\) 则增加 \(b_{i,j}\) 的权值,对于一个格点 \((i,j)\) 而言,若四连通格子中有 \(k\) 个格点的权值与之不同,额外增加 \(k\times c_{i,j}\) 的权值。

在合适的选数下,最大权值是多少?

\(n,m\leq 100\)


类比小M的作物与文理分科,为了解决相邻两个格子不同的限制,我们给图黑白染色,选择其中一种颜色的所有格子并交换它们的 \(a,b\) 权值。

则现在相邻两个格子相同才有权值增益,做文理分科类似的做法。

狼和羊的故事

【ZJOI2009】

给定一个 \(n\times m\) 的矩阵,格子有黑白灰三色,你需要选择矩阵内部某格子的边缘进行划分,使得每一块区域内都不满足同时存在黑白两色的格子,问最少需要的边缘数量。

\(n,m\leq 100\)


超源连黑色,超汇连白色,黑与白的相邻处连一条容量为 \(1\) 的边,这些显然。

问题是:灰色怎么办?

其实,把相邻两个格子间连一条边权为 \(1\) 的边即可。此时最小割算法已经自动解决了这个问题。

Fri

圈地

【JSOI2015】

给定一个 \(n\times m\) 的矩阵,格子有黑白灰三色,你需要选择矩阵内部某格子的边缘进行划分,各黑白格点有收益,若你能拿到某格点的收益仅当它所在连通区域内不存在异色(灰色不算)点,边缘有代价。

问最大收益。

\(n,m\leq 100\)


超源连接所有黑色点,超汇连接所有白色点,容量是收益。

类比狼和羊的故事,相邻格子之间的容量是边缘的代价。

则最小割为最小损失,则最大收益易求。

保密

【SDOI2011】

每个点的代价是从 \(n\) 号点出发的一条最优比值路径,问该二分图的最小点覆盖。

\(n\leq 700, m\leq 10^5, n_1\leq \min(n,160), m_1\leq 10^4\)


最优比值路径用01分数规划即可得到。

考虑如何做二分图的最小点覆盖:

超源连接左部点,超汇连接右部点,容量为选中代价,如果二分图中存在一条边就连该边,容量为正无穷。

则最小割为最小点覆盖。

切糕

【HNOI2013】

平面上有 \(P\times Q\) 个点,各点的权值是 \(R\),选择 \((P,Q,R)\) 的代价为 \(W(P,Q,R)\),记 \(f(P,Q)\)\((P,Q)\) 处的选择,要求 \(\forall |x-x'|+|y-y'|=1, |f(x,y)-f(x',y')|\leq D\),求最小代价。

\(P,Q,R\leq 40\)


由于每个 \((P,Q)\) 只选一个值,即任意选值可以割开,不妨每个点建一条长度为 \(R+1\) 的链,形如 \(S\to id(i,j,1)\to id(i,j,2)\to \cdots \to id(i,j,R)\to T\),最前面一条容量为正无穷,其后均为 \(W(i,j,k)\)

接下来是距离的限制,只要考虑 \(f(i,j) - f(x,y)\leq D\),这是相互的,所以只需要每一条这个限制均成立即可。

目标是 \(f(i,j) - f(x,y) > D\) 时连通,发现将 \(\forall k\in (D,R]\)\((i,j,k)\)\((tx,ty,k-D)\) 连容量为正无穷的边即可。

LIS

【SDOI2014】

给定一个长度为 \(n\) 的序列 \(A\)。删除某个元素有代价,各元素有属性。

求一组花费最小的方案使得 \(A\) 的 LIS 长度减少 \(1\),若有多组解给出属性升序排列后字典序最小者,输出方案。

\(n\leq 700\)


建模类比最长不下降子序列问题,问题在于输出方案。

首先按属性升序排序是明显的,接下来考虑判断 \((u,v)\) 是否属于最小割。

判断一条边是否为割边,就是从该边的入点无法到达出点,这里考虑未满流边。

若无法达到,则其是割边,删除该条边,重新跑最小割。

Telecowmunication

给定 \(n\) 个点,求一组大小最小,字典序最小的割点集 \(S\),使得删去这些点后 \(s,t\) 在图中不连通。

\(n\leq 100\)


大小最小的限制,考虑最小割。

每个点拆成入点和出点,则一条无向边 \((u,v)\) 连接 \(u\) 出和 \(v\) 入,\(v\) 出和 \(u\) 入,非 \(s,t\) 的入出点之间连一条容量为 \(1\) 的边,表示可以割掉。

跑出最小割后,按照 LIS 的思路,依次判断每条边是否可删即可。

Pollutant Control

给定一张网络 \(G=(V,E)\),求最少需要花费多少代价才能使得 \(1\) 号点与 \(n\) 号点不连通。

最小化代价,然后最小化点数量,然后找出字典序最小解。

\(|V(G)|=n\leq 33, |E(G)|\leq 10^3\)


最小割,建模如题。

如何最小化代价,然后最小化点数量?记 \(P\) 为一大数,则将原先代价 \(w\) 改为 \(wP+1\),则求出最小割,整除 \(P\) 与对 \(P\) 取余的结果分别是前两问的答案。

第三问按照 LIS 的思路退流计算即可。

开发计划

\(n\) 个计划,分别有收益或代价,有依赖关系,求一组收益最大的计划组,并给出方案。

\(n\leq 3000\)


本题中超源连所有有收益的计划,超汇连所有有代价的计划。

而依赖关系直接建边即可,容量为无穷大。

则所求为最小损失,则最大收益易求。

方案:从超源开始,经过所有未满流边所经过的所有点即为答案。

人员雇佣

【国家集训队2009】

\(n\) 个人,征用每个人有代价,且两个人同时被征用有 \(E_{i,j}\) 的收益,有任何一个人不被征用(不同时)有 \(E_{i,j}\) 的损失,求最大收益。

\(n\leq 1000\)


超源连接每一个人的容量是该行 \(E_{i,j}\) 的总和,断边表示不征用。

超汇连接每一个人的容量是 \(A_i\),断边表示征用。

至于一个人 \(i\) 被征用,另一个人 \(j\) 是否被征用的差距是 \(2E_{i,j}\),当一个人被征用而另一个人不被时收益恰好减少 \(2E_{i,j}\)

则最小割为最小损失,则最大收益易求。

posted @ 2024-03-24 09:11  ydzr00000  阅读(47)  评论(0编辑  收藏  举报