2 条题解

  • 0
    @ 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

信息

ID
2218
难度
9
分类
数据结构 | 并查集线段树 点击显示
标签
递交数
3
已通过
1
通过率
33%
被复制
1
上传者