CF802O April Fools' Problem (hard)

题意

nn 道题,第 ii 天可以花费 aia_i 准备一道题,花费 bib_i 打印一道题,每天最多准备一道题,打印一道题,准备的题可以留到以后打印,求打印 kk 道题的最小花费.

1kn5×1051\le k\le n\le 5\times10^5

题解

显然可以费用流解决

费用流建图

考虑优化费用流

[object Promise]

根据引理得,每次增广的增广路都是一条形如 SXYTTS\rightarrow X\rightarrow Y\rightarrow T'\rightarrow T 的路径,一共增广 kk

fif_i 表示在残流网络上 i+1i+1 点向 ii 的流量,则一条增广路合法当且仅当 SX,YTS\rightarrow X,Y\rightarrow T' 这两条边有流量且满足下列两个条件之一:

  • XYX\le Y
  • X>YminYi<Xfi>0X>Y\land \min_{Y\le i<X}f_i>0

尝试用线段树来模拟这一过程,对于每一个区间 [l,r][l, r],维护 aa 的最小值 minA\text{minA}bb 的最小值 minB\text{minB},从 xxll 有流量的最小 axa_x flowA\text{flowA},从 r+1r+1xx 有流量的最小 bxb_x flowB\text{flowB},从左到右的最小费用流 flowLtoR\text{flowLtoR},从右到左的最小费用流 flowRtoL\text{flowRtoL},从 r+1r+1ll 的流量 minFlow\text{minFlow}

每找到一条增广路,在线段树上更新流量并把 aX,bYa_X,b_Y 设为 Infinity\text{Infinity}

这时候发现这个做法是不可行的,因为没法对流量快速地区间修改

发现 fnf_n 的值总是 00,于是使 flowA\text{flowA}flowB\text{flowB}flowRtoL\text{flowRtoL}整个区间每条边的流量都减去 minFlow\text{minFlow}之后的值,这样不影响区间 [1,n][1, n] 的答案,而且区间修改时只需要更新 minFlow\text{minFlow}

为了方便pushup,还需要 minFlowRtoL\text{minFlowRtoL} 表示假设区间内从右到左的每条边都有流量时,从右到左最小的费用

细节详见代码

每次增广的时间复杂度可以做到 Θ(logn)\Theta(\log n),总时间复杂度为 Θ(klogn)\Theta(k\log n)

代码 codeforces submission 143973639

CF802O April Fools' Problem (hard)

https://gzezfisher.top/cf802o/

作者

Fisher Cai

发布于

2022-01-26

更新于

2025-07-22

许可协议

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×