因为存在删除操作,对于这类模拟费用流问题不容易操作,考虑线段树分治变为只有插入的情况,但是会额外多出一个 log\log 的时间复杂度代价。

首先考虑静态的情况。考虑建立费用流模型,每次一定会选择最长路增广,发现所有有权值的边都是从原点出发的,这意味着一个员工如果被选中了,这在之后的增广中一定不会被丢弃。所以我们只需要每次考虑(按照价值从大到小)加入一个员工后,是否仍然存在完美匹配。此时可以套用 Hall 定理(只需观察每个子树内的已有员工数量,不超过子树大小即是合法的),维护 rur_u 表示 uu 这棵子树还能塞多少个点。每次插入前需要求出到根链上的最小值。

考虑插入的情况,此时不是按大小而是按照时间插入。插入后可能存在某个点 ru=1r_u=-1,我们需要删除之前已经选择的某个员工。找到深度最大的 uu’ 满足 ru=1r_{u’}=-1,删去 uu’ 子树中价值最小的员工就能恢复所有 r0r\ge 0 的条件。使用树链剖分 + 线段树优化,时间复杂度 O(nlog2n)O(n\log ^2 n)

再套上一层线段树分治就是三个 log\log。内层如果替换为全局平衡二叉树可以减少一个 log\log

0 条评论

目前还没有评论...