题目地址:Fabled Rooks
题目大意:n * n 的棋盘上摆了 n <=10^5 个车,让他们两两不攻击,每个车必须摆在一个给定矩形里,给出一个解决方案?
1. 贪心
由于行列互不影响, 所以可以分两遍求。第一遍确定每个车的行数,第二遍确定列数。
以行为例,若从左到右扫描,则按照区间的右端点升序排序,因为如果扫到一个位置两枚棋子都可以放,则选择右端点较小的那个(右端点大的后面还有机会)。
2. 二分图匹配
有个毒瘤老师把题目改成了这样:n * n 的棋盘上摆了 n <=10^5 个车,让他们两两不攻击,每个车必须摆在一个给定矩形里,求哪些车的摆放位置是确定的?
贪心就无法解决了。
行和列依然分开来做,每个棋子与它能在的每个行连边,再与能在的每个列连边。二分图中环上的点就是无法确定的。
如果暴力连边, 复杂度肯定承受不了。毒瘤老师说需要 ST 表优化。怎么优化呢?
上网搜也搜不到。线段树优化网上倒是有。那就用线段树优化吧 OvO。
判断环的方法是,往右只保留匹配边,往左只保留未匹配边,它是不是在一个环中,缩强连通分量即可。