题解:AT_arc168_f [ARC168F] Up-Down Queries

· · 题解

有长为 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$。

这篇主要讲如何自然转换模拟费用流。

a_0 = 0,则容易发现整个操作的过程中,a_i​ 一定单调不降。

于是差分,令 d=a_i-a_{i-1},则 ans=\sum d_i(m+1-i)

这启发我们每次给可重集加入 d_im+1-i,最终要求 S 集合内所有数的和。

于是转化要维护如下问题:

初始有空可重集,每次加两个 m-x_i,删除集合内最大值,最终求集合内数的和。

考虑经典 trick,把删除最大值变成删除任意数,最终求最小可能集合内数的和。

此时就很好建立费用流了(源汇为 S,T,括号内前者表示流量,后者表示费用):

\forall i,(S\to i;2,m-x_i),(i\to T;1,0),\forall i<j,(i\to j,\infty,0)

其中 i\to j 的边表示一个数在它加入的时刻后被删除,需要有桥梁连过去。

而这类边显然能拆为 (i\to i+1,\infty,0)

然后考虑模拟这个费用流。

显然我们找到一个合法的最大流,然后不断找环增广。

把初始 x 看成从 0 开始修改。

对于修改 x,考虑一定是增广包含 x 的环。

其中分讨 $y<x$ 和 $y>x$​。考虑左侧环和右侧环,线段树维护可达点,和区间最值即可。 复杂度 $O(n\log n)$。 [code](https://atcoder.jp/contests/arc168/submissions/66660542)