音乐播放器
HMF-have much fun Site
 
文章 标签
16

Powered by Gridea | Theme: Fog
载入天数...
载入时分秒...
总访问量:  |   访问人数:

【题解】CF280D k-Maximum Subsequence Sum

  热度: loading...

模拟费用流的入门好题。

所谓 模拟费用流 ,就是在问题可以用费用流的思想解决,但却不适用费用流的复杂度的时候,我们用一些方法(大部分时候是数据结构)来模拟费用流进行的过程,从而降低复杂度,通过题目的算法。

考虑先对题目构建费用流模型,将点的权值转换到边上,即构造 n+1n+1 个点,点 ii 和点 i+1i+1 之间的边的权值为 aia_i ,从源点向每个点连边,从每个点向汇点连边,从 ii 点流到 jj 点说明取了 aiaj1a_i \sim a_{j-1} 这一段的值,求最大费用流。

考虑直接模拟费用流的过程,最大费用流每次选择费用最大的一条路径增广,由于我们连边的限制,最大路径一定是序列里的一个区间。由于是一个区间,我们可以使用线段树直接维护最大的区间,直接加上这个区间的贡献,然后再按照费用流的步骤将区间内的费用取反。

每一次流动如果流的位置没取过则相当于取了这一段区间,如果取过了则相当于将这一段区间消除(即反悔)。每次流之后实质上取到的区间一定会增加一个,否则相当于它将一次取得区间完全消除,而增广的每一次都是有意义的,不可能被完全消除贡献。

因此我们用线段树每次取最大区间,取完后取反,这个过程进行 kk 次,取到的最大权值就是答案。

费用流的本质就是可以反悔的贪心,模拟费用流也继承了这一点。

其他例题:

P6122 [NEERC2016]Mole Tunnels

【UER #8】雪灾与外卖

P5470 [NOI2019] 序列

P6943 [ICPC2018 WF]Conquer The World