有一个 $n×n$ 的矩阵,每行每列至多能放一个棋子,另外有 $q$个矩形的区域不能放棋子(这些矩形区域互不相交),问最多能放多少个棋子。$n,q≤10^4$
朴素来想:
对于每行连接所可以控制的列,跑个最大流。但是点明显很多,那么对于一个区间可以用线段树维护。
- 如果出现$0101010101$,只需要去掉每个叶子节点往上的那条边。
- 维护一个区间,可以用lazy表示是存在。(这里可以不用下方标记)
类似扫描线的方法,对每条边更新,类似可持续化线段树的方法更新每次所连的边。
- 对于每次更新都需要更新节点,(即新增节点,一路上都需要,但是左右节点是可以继承原先的状态的)我们发现每次头节点都要更新。
- 根据头节点是否全部没有效果,再连接新增的节点。
- 记住要初始化!
- 不需要$poshdown$.
边的多少和点的多少显然$n=m=(n+q)\log n$
代码
1 |
|