1 条题解
-
0
题目大意
有 个水塔,第 个水塔初始水量为 ,前方巫师的能力为 。相邻水塔 与 之间有一根容量为 的管道。处理过程按 到 顺序进行:巫师 从当前塔中取走至多 的水变成酒;剩余的净水至多 流入下一塔。有 次修改,每次修改一个 对应的 ,求每次修改后的总产酒量。
网络流建模
建立一个流网络,顶点共 个:源点 ,汇点 ,以及 个代表水塔的点。
- 对每个 ,添加边 ,容量为 (原始水量);
- 对每个 ,添加边 ,容量为 (巫师转化能力);
- 对每个 ,添加边 ,容量为 (管道容量)。
从 到 的最大流就是原问题的产酒总量。由最大流最小割定理,我们可以改为求该网络的最小割。
最小割与状态选择
考虑任一个 - 割。对于每个 ,必然要割掉 或 中的至少一条,否则存在路径 使 与 连通。可以证明:最小割中恰好包含这两条边中的一条。
证明:若一个割同时包含 和 ,我们分两种情况:
- 能到达 :此时去掉 不影响 到达 的能力,去掉后割的容量不会变大。
- 不能到达 :此时去掉 不会使 到达 ,割的容量同样不会变大。 因此总可以去掉其中一条边而得到费用不超过原割的新割,故最小割中不会同时包含两者。
于是每个 的选择构成一个二选一:割 (代价 ),称为状态 ;或割 (代价 ),称为状态 。
设每个位置的选择用 表示。注意当出现 且 时, 可以通过 (未割)、管道 (未割)以及 (未割)到达 ,因此为了切断这条路径,必须额外割掉边 ,付出代价 。
问题转化为:为每个 选择 或 ,最小化
$$\sum_{i: x_i = A} a_i + \sum_{i: x_i = B} b_i + \sum_{i: x_i = B,\; x_{i+1} = A} c_i $$
动态规划
令 表示前 个位置,且第 个选择 的最小代价;
表示前 个位置,且第 个选择 的最小代价。转移时考虑相邻状态产生的额外管道代价:
- 若当前选 :前一个是 无额外代价,前一个是 需额外 。
- 若当前选 :无论前一个是 还是 ,都不会触发 模式,无额外代价。
转移方程如下:
$$\begin{aligned} dp[i][0] &= a_i + \min\big(dp[i-1][0],\; dp[i-1][1] + c_{i-1}\big) \\ dp[i][1] &= b_i + \min\big(dp[i-1][0],\; dp[i-1][1]\big) \end{aligned} $$初始条件:。 最终答案即为 。
线段树优化
为了支持单点修改,使用线段树维护上述 DP 的区间合并。
线段树的每个节点表示一个区间 ,存储一个 的矩阵 ,其中 表示区间左端点状态为 、右端点状态为 时,该区间内部的最小代价(包含区间内所有 以及内部相邻位置之间的 )。叶节点(区间长度为 ):
- (全 )
- (全 )
- 其余 设为充分大的数(表示非法状态,因为单点区间左右端点必须相同)。
合并操作:将左儿子 (区间 )和右儿子 (区间 )合并为父亲 。
$$U[x][y] = \min_{p,q \in \{0,1\}} \Big( L[x][p] + R[q][y] + (p=1 \land q=0 \;?\; c_{mid} : 0) \Big) $$
枚举左儿子的右端点状态 和右儿子的左端点状态 ,当 且 时,需要额外加上边 的容量 。合并公式为:即:
$$U[x][y] = \min\begin{cases} L[x][0] + R[0][y] \\ L[x][1] + R[1][y] \\ L[x][0] + R[1][y] \\ L[x][1] + R[0][y] + c_{mid} \end{cases} $$建树时自底向上合并,每次更新只需修改叶节点并向上更新路径,单次操作 。
最终答案取根节点四个状态的最小值:
$$\text{ans} = \min\big(U[0][0],\, U[0][1],\, U[1][0],\, U[1][1]\big) $$总时间复杂度 ,空间复杂度 ,完全满足本题数据范围。
- 1
信息
- ID
- 7190
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者