Problem 1
数轴上 \(n\) 个老鼠,\(m\) 个洞。每个老鼠要找一个洞回去,代价为距离(\(|x_1-x_2|\))。求最小代价和。
把老鼠和洞排序之后建出网络,大概是这样。

考虑费用流增广的过程。按照坐标从小到大加入点。
- 加进来老鼠:按照增广的思路,我可以在左右两边的洞中,选一个距离较小的进去。
- 加进来洞:这时候有神之一手。反向边会在什么时候影响增广?
当且仅当形如这样:
就是前一个老鼠向右走了,但是这个老鼠可以吃一个负贡献,使得向左走更优。
这个时候的反向弧,终点只会在某个洞的位置。所以我们扫到洞 \(p\) 的时候,如果有反向弧指向她,那么考虑她左边的空洞。
设这条反向弧的边权为 \(-w\),流量为 \(f\),那么效果等价于把 \(p\) 左边的空洞中,最右边的 \(f\) 个的坐标向右移动 \(2w\)。
那用线段树应该不难实现。考虑两棵线段树,一棵用于维护反向弧的区间加标记,一棵用于查找左边最近的空洞,也需要实现区间加。
但是陈江伦老师说除了排序可以线性?不懂。
然后似乎有一个更好写的做法。
仍然按照坐标从小到大考虑。但是这次对于反悔弧,我们在加入一个洞的时候考虑它。并且加入一个老鼠的时候,只考虑在她左边的洞。
加入一个洞的时候可能会出现这样的事情:

出现一个负环。
那么事情就变得简单了:加入老鼠的时候,查询前面没被使用过的最左的洞;避免没有的情况,可以加一个极远的洞。而加入洞的时候,考虑前面被使用过的最【?】的洞,判一下环的权值是不是负数,是的话就增广掉。
然后这个【?】,实际上是 老鼠和洞的距离 加 老鼠的坐标 作为关键字。这样更容易出负环。画个图不难理解。
用两个堆维护就好。
Problem 2
CF865D
建图是 trivial 的。考虑每次新增一支股票,会出现什么样的增广。
考虑到唯一有可能的正环就是,把之前某一次卖出 put off,改到今天卖掉。
那这个容易用堆维护,带上正常增广一起搞。复杂度 \(O(n\log n)\)。
Problem 3
P6943
续 Problem 1,相当于把数轴变成了树,坐标改成深度。\(y\) 相当于老鼠,\(x\) 相当于洞。然后洞的容量是假的,可以直接拆成 1e6 个单点。
续用 Problem 1 的堆的做法,改成可并堆。
然后子树合并的位置是有一点细节的。具体地,需要计算被占掉点 \(x\) 的的“等效深度”。算出来的结论是,\(2dep_u-dep_x\)。然后合并的时候,对于子树 \(u\),暴力枚举空洞堆里面的空洞,合并上去就好。复杂度是没有问题的。\(O(V\log V)\)。