2 条题解
-
0
何老师 (root) LV 0 MOD @ 2025-09-16 16:11:28
离散+切割
把所有Ai,Bi存储在cut[1]..cut[N+N]中;
对cut[]由小到大排序,则cut[i]..cut[i+1]就是一条离散元线段
对于cut[i]..cut[i+1],在所有包含这条离散线段的矩形中找一个最高的
最为离散矩形cut[i]..cut[i+1]的高度
然后算出所有离散矩形的面积和即可!
时间复杂度:O(N^2)
优化:
对所有矩形P[1]..P[N]按P[i].A由小到大排序
设大顶队(以H为关键字):pq,相当于滑动窗口,用于维护包含元先段的矩形
从左到右扫描每条元线段:i=1..2*N-1,线段cut[i]..cut[i+1]
P[j].A<=cut[i]的进队列
P[j].B<=cut[i]的出队列则pq.top().H就是以线段cut[i]..cut[i+1]为底边矩形的高,计算其面积
时间复杂度:O(Nlog N)
-
0@ 2022-05-27 10:28:42
很经典的题,通解是用线段树搞,但是从cqz神犇那里学到一招,排序后用并查集做。
考虑按照矩形的高度由高到低排序,则后面的矩形一定无法覆盖掉前面矩形的部分。
那么我们设f[i]为覆盖了i坐标这点的所有矩形的右边界,则用并查集维护即可。
但注意坐标范围极大,无法一个个扫描坐标计算,所以离散化一下再按照上述思路做。
- 1