1 条题解

  • 0
    @ 2026-5-17 19:57:28

    题目大意

    nn 个水塔,第 ii 个水塔初始水量为 aia_i,前方巫师的能力为 bib_i。相邻水塔 iii+1i+1 之间有一根容量为 cic_i 的管道。处理过程按 i=1i=1nn 顺序进行:巫师 ii 从当前塔中取走至多 bib_i 的水变成酒;剩余的净水至多 cic_i 流入下一塔。有 qq 次修改,每次修改一个 pp 对应的 ap,bp,cpa_p, b_p, c_p,求每次修改后的总产酒量。


    网络流建模

    建立一个流网络,顶点共 n+2n+2 个:源点 s=n+1s = n+1,汇点 t=n+2t = n+2,以及 nn 个代表水塔的点。

    • 对每个 ii,添加边 sis \to i,容量为 aia_i(原始水量);
    • 对每个 ii,添加边 iti \to t,容量为 bib_i(巫师转化能力);
    • 对每个 1in11 \le i \le n-1,添加边 ii+1i \to i+1,容量为 cic_i(管道容量)。

    sstt 的最大流就是原问题的产酒总量。由最大流最小割定理,我们可以改为求该网络的最小割


    最小割与状态选择

    考虑任一个 ss-tt 割。对于每个 ii,必然要割掉 sis \to iiti \to t 中的至少一条,否则存在路径 sits \to i \to t 使 sstt 连通。可以证明:最小割中恰好包含这两条边中的一条。

    证明:若一个割同时包含 sis \to iiti \to t,我们分两种情况:

    1. ss 能到达 ii:此时去掉 sis \to i 不影响 ss 到达 ii 的能力,去掉后割的容量不会变大。
    2. ss 不能到达 ii:此时去掉 iti \to t 不会使 ss 到达 tt,割的容量同样不会变大。 因此总可以去掉其中一条边而得到费用不超过原割的新割,故最小割中不会同时包含两者。

    于是每个 ii 的选择构成一个二选一:割 sis \to i(代价 aia_i),称为状态 AA;或割 iti \to t(代价 bib_i),称为状态 BB

    设每个位置的选择用 xi{A,B}x_i \in \{A, B\} 表示。注意当出现 xi=Bx_i = Bxi+1=Ax_{i+1} = A 时,ss 可以通过 sis \to i(未割)、管道 ii+1i \to i+1(未割)以及 i+1ti+1 \to t(未割)到达 tt,因此为了切断这条路径,必须额外割掉边 ii+1i \to i+1,付出代价 cic_i

    问题转化为:为每个 ii 选择 AABB,最小化

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

    动态规划

    dp[i][0]dp[i][0] 表示前 ii 个位置,且第 ii 个选择 AA 的最小代价;
    dp[i][1]dp[i][1] 表示前 ii 个位置,且第 ii 个选择 BB 的最小代价。

    转移时考虑相邻状态产生的额外管道代价:

    • 若当前选 AA:前一个是 AA 无额外代价,前一个是 BB 需额外 ci1c_{i-1}
    • 若当前选 BB:无论前一个是 AA 还是 BB,都不会触发 BABA 模式,无额外代价。

    转移方程如下:

    $$\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[1][0]=a1,  dp[1][1]=b1dp[1][0] = a_1,\; dp[1][1] = b_1。 最终答案即为 min(dp[n][0],dp[n][1])\min(dp[n][0],\, dp[n][1])


    线段树优化

    为了支持单点修改,使用线段树维护上述 DP 的区间合并。
    线段树的每个节点表示一个区间 [l,r][l, r],存储一个 2×22 \times 2 的矩阵 MM,其中 M[x][y]M[x][y] 表示区间左端点状态为 xx、右端点状态为 yy 时,该区间内部的最小代价(包含区间内所有 ai,bia_i, b_i 以及内部相邻位置之间的 ckc_k)。

    叶节点(区间长度为 11):

    • M[0][0]=aiM[0][0] = a_i (全 AA
    • M[1][1]=biM[1][1] = b_i (全 BB
    • 其余 M[0][1],M[1][0]M[0][1], M[1][0] 设为充分大的数(表示非法状态,因为单点区间左右端点必须相同)。

    合并操作:将左儿子 LL(区间 [l,mid][l, mid])和右儿子 RR(区间 [mid+1,r][mid+1, r])合并为父亲 UU
    枚举左儿子的右端点状态 pp 和右儿子的左端点状态 qq,当 p=Bp = Bq=Aq = A 时,需要额外加上边 midmid+1mid \to mid+1 的容量 cmidc_{mid}。合并公式为:

    $$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} $$

    建树时自底向上合并,每次更新只需修改叶节点并向上更新路径,单次操作 O(logn)O(\log n)

    最终答案取根节点四个状态的最小值:

    $$\text{ans} = \min\big(U[0][0],\, U[0][1],\, U[1][0],\, U[1][1]\big) $$

    总时间复杂度 O((n+q)logn)O((n+q)\log n),空间复杂度 O(n)O(n),完全满足本题数据范围。

    • 1

    信息

    ID
    7190
    时间
    1000ms
    内存
    256MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者