1 条题解
-
0
题解
思路
把每座水塔看成一个流量网络中的点。建立源点 和汇点 :从 向点 连容量为 的边,从点 向 连容量为 的边,再从点 向点 连容量为 的边。原过程能够酿出的葡萄酒总量恰好等于这个网络的最大流。
由最大流最小割定理转而维护最小割。对每个点,只需考虑它位于源侧或汇侧。若点 位于汇侧,割掉 ,代价为 ;若点 位于源侧,割掉 ,代价为 。此外,仅当点 位于源侧而点 位于汇侧时,还要割掉容量为 的边。
做法
线段树的每个区间维护一个 表。表中第 项表示区间左端点状态为 、右端点状态为 时的最小割代价。叶子只有两种合法状态,代价分别为 与 。
合并左右区间时枚举相接的两个端点状态。若左区间右端在源侧、右区间左端在汇侧,额外加上分界阀门的容量;其余情况直接相加并取最小值。一次修改只影响对应叶子以及从该叶子到根的合并结果。根节点四个状态的最小值就是答案。
在第一类子任务中,可在每次修改后直接按水塔顺序模拟。第二类子任务的阀门永不截断水流,可维护 的最大后缀和来计算最终剩余水量。
正确性证明
网络中,从源点流入第 个点的流量表示该塔拥有的水,从该点流向汇点的流量表示转化成的葡萄酒,流向下一点的流量表示通过阀门的水。因此可行流与原酿造过程一致,最大流值就是 。
任意最小割可用每个水塔点所属的一侧表示。点在汇侧时边 跨割,贡献 ;点在源侧时边 跨割,贡献 。相邻两点只有在前者位于源侧、后者位于汇侧时,边 跨割并贡献 。线段树表恰好枚举并最小化这些状态及跨边代价,所以根节点给出整个网络的最小割。由最大流最小割定理,该值等于所求葡萄酒总量。
复杂度
建树时间为 ,每次修改时间为 ,总时间为 ,空间为 。
- 1
信息
- ID
- 1432
- 时间
- 5000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 0
- 上传者