1 条题解

  • 0
    @ 2026-9-3 11:08:01

    题解

    思路

    把每座水塔看成一个流量网络中的点。建立源点 ss 和汇点 tt:从 ss 向点 ii 连容量为 aia_i 的边,从点 ii 向 tt 连容量为 bib_i 的边,再从点 ii 向点 i+1i+1 连容量为 cic_i 的边。原过程能够酿出的葡萄酒总量恰好等于这个网络的最大流。

    由最大流最小割定理转而维护最小割。对每个点,只需考虑它位于源侧或汇侧。若点 ii 位于汇侧,割掉 s→is\to i,代价为 aia_i;若点 ii 位于源侧,割掉 i→ti\to t,代价为 bib_i。此外,仅当点 ii 位于源侧而点 i+1i+1 位于汇侧时,还要割掉容量为 cic_i 的边。

    做法

    线段树的每个区间维护一个 2×22\times2 表。表中第 (u,v)(u,v) 项表示区间左端点状态为 uu、右端点状态为 vv 时的最小割代价。叶子只有两种合法状态,代价分别为 aia_i 与 bib_i。

    合并左右区间时枚举相接的两个端点状态。若左区间右端在源侧、右区间左端在汇侧,额外加上分界阀门的容量;其余情况直接相加并取最小值。一次修改只影响对应叶子以及从该叶子到根的合并结果。根节点四个状态的最小值就是答案。

    在第一类子任务中,可在每次修改后直接按水塔顺序模拟。第二类子任务的阀门永不截断水流,可维护 ai−bia_i-b_i 的最大后缀和来计算最终剩余水量。

    正确性证明

    网络中,从源点流入第 ii 个点的流量表示该塔拥有的水,从该点流向汇点的流量表示转化成的葡萄酒,流向下一点的流量表示通过阀门的水。因此可行流与原酿造过程一致,最大流值就是 W(a,b,c)W(a,b,c)。

    任意最小割可用每个水塔点所属的一侧表示。点在汇侧时边 s→is\to i 跨割,贡献 aia_i;点在源侧时边 i→ti\to t 跨割,贡献 bib_i。相邻两点只有在前者位于源侧、后者位于汇侧时,边 i→i+1i\to i+1 跨割并贡献 cic_i。线段树表恰好枚举并最小化这些状态及跨边代价,所以根节点给出整个网络的最小割。由最大流最小割定理,该值等于所求葡萄酒总量。

    复杂度

    建树时间为 O(n)O(n),每次修改时间为 O(log⁡n)O(\log n),总时间为 O(n+qlog⁡n)O(n+q\log n),空间为 O(n)O(n)。

    • 1

    信息

    ID
    1432
    时间
    5000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    1
    已通过
    0
    上传者