CF1408H(模拟网络流)

· · 个人记录

又是一道模拟网络流。

首先先建图,发现只能暴力建...我们考虑一些性质,把题目进行转化。

假设0的个数为cnt,我们发现答案上界是cnt/2,我们考虑,一个点如果右侧有至少cnt/2个点,那么他必然是只需要考虑左侧匹配,如果左侧有至少cnt/2个也同理。

于是我们把点分成两堆(L,R),L表示右侧有大于等于cnt/2个点,R同理。我们考虑在L和R内部匹配就可以。

我们再考虑,同一个权值,在L集合,肯定是越右边越优(因为更加有可能匹配到),在R集合越左边越优。我们把权值只保留两个。考虑建图:我们把S向权值连边,容量为1,把权值向在L,R两侧的集合内保留的位置连边,容量为1,。我们在L集合内i->i-1,在R集合内i->i+1,容量为INF。

跑最大流就可以。但边数太多会tle。我们考虑模拟网络流。

最大流=最小割(模拟网络流从最小割角度会容易优化)

我们考虑,割的边都是L的前缀,R的后缀,加上一部分与S连的。于是答案就是l+r+col-在r中出现的颜色数

我们考虑枚举L前缀割了多少,维护右侧集合割多少的最优值,在i逐渐递增的过程中,考虑当前位置在右侧中出现位置为p,那么如果右侧割[p,m]个点(m是右侧0的个数),那么他就不需要被计算入内(因为S集合已经不连通)。