线段可以直接看成矩形。
从上往下扫描线。总共的黑格数是好求的,只需要维护一下当前行有多少黑格,在每个矩形加入和删除的时候更新。
求连通块数时,首先可以将同一个矩形上的格子作为一个整体,它们一定是连通的。在加入一个矩形的时候求它上、左、右相邻的矩形然后并查集合并。求这些矩形只需要维护一下当前行存在的矩形对应的区间,然后在 set 上二分并遍历。
时间复杂度是 $O(n+(k+a)\log k)$。其中 $a$ 是相邻的矩形的对数。
可以证明 $a=O(k)$:考虑左右相邻的矩形,一个的矩形至多和四个高度更大的矩形相邻(左边两个、右边两个),上下相邻同理。
所以时间复杂度是 $O(n+k\log k)$。