定义联通块为一个点的集合,该集合中的点相互碰撞,可留下任意一个点
这道题其实是求 联通块 个数
考虑 (O(n^2)) 做法:
用并查集思想,枚举每个点对,如果可以发生碰撞,就合并
(但是ACM赛制没有部分分)
满分做法:
对于两个不相交联通块 (S,T),如果 (S) 中有点 (x), (T) 中有点 (y),且 (x) , (y)可以发生碰撞,那么 (S) (cap) (T) 也是一个联通块(自证)
将点按照先 (x) 后 (y) 的顺序排序后,可以发现联通块是连续的((1) 至 (x) 是一个联通块, (x+1) 至 (n) 又是一个联通块)
那么我们只需要计算联通块的断点即可
设 (maxl[i]) 表示从左往右前 (i) 个点, (y) 坐标的最大值(字面意思)
(然后 (maxr[i]) , (minl[i]) , (minr[i]) 也是字面意思)
排序后若点 (i) 和点 (i+1) 不在一个联通块内,当且仅当 (minl[i]) (leq) (maxr[i])
然后 (O(n)) 遍历一遍就可以了
代码不放了,去 (OJ) 上看吧