题解:AT_arc168_f [ARC168F] Up-Down Queries
masterhuang · · 题解
有长为
N 的操作序列x = (x_1, x_2, \dots, x_N) ,对f(x) 定义如下:有长为
M 初始全0 的序列y ,对于i = 1, 2, \dots, N 依次进行如下操作。
\forall j\le x_i,y_j\gets \max(y_j-1,0) \forall j>x_i,y_j\gets y_j+1 现在给出初始的操作序列 $x$,有 $Q$ 次修改操作,将 $x_i$ 修改为 $k$,每次操作后输出当前的 $f(x)$。 $1\le N,M,Q\le 2.5\times 10^5,1\le x_i,k\le M$。
这篇主要讲如何自然转换模拟费用流。
- 可以发现一次操作相当于先对
x_i < j \le m 的a_j 加上2 ,再对全局做a_i = \max(0, a_i - 1) 的操作。
记
于是差分,令
这启发我们每次给可重集加入
-
考虑
+2 ,相当于d_{x_i+1} 加2 ,于是相当于往S 加入两个m-x_i 。 -
考虑
-1 ,由于钦定a_0 始终为0 ,于是相当于第一个非0 的d_i 减1 ,考虑d 以及加入的过程,发现相当于删除集合内最大值!
于是转化要维护如下问题:
初始有空可重集,每次加两个
m-x_i ,删除集合内最大值,最终求集合内数的和。
考虑经典 trick,把删除最大值变成删除任意数,最终求最小可能集合内数的和。
此时就很好建立费用流了(源汇为
其中
而这类边显然能拆为
然后考虑模拟这个费用流。
显然我们找到一个合法的最大流,然后不断找环增广。
把初始
对于修改