题目链接
做法
至少包含一个点的矩阵数等于总矩阵数减去不包含任意一个点的矩阵数。
考虑将点按照纵坐标排序,进行类似扫描线的操作。每一列有用的点是最靠近当前行的点,记录它们的纵坐标。如果这一层存在一段长度为 $ s $ 不包含点,则它对答案的贡献为 $ \frac{(s + 1) \times s}{2} $ ;如果是纵坐标上一段都满足,那就再乘上纵坐标上的长度。
维护一个 $ Treap $ ,$ value $ 值中序遍历表示横坐标的一段,$ key $ 值表示横坐标为该值时纵坐标的最大值。每次一些节点 $ key $ 值会变大,然后用 $ splay $ 的方式旋转满足 $ Treap $ 的性质,同时维护答案。
由于数据随机,所以复杂度 $ O(n \log n) $ 。
1 |
|