P1382 楼房

P1382 楼房

每个矩形拆成2个坐标按$x$轴排序,蓝后$multiset$维护最高值。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<set>
#include<algorithm>
using namespace std;
int n,h,H,tot;
pair<int,int> a[200005],f[400005];
multiset<int> s;
#define mp make_pair
#define fi first
#define se second
int main(){
    scanf("%d",&n);
    for(int i=0,b,c,d;i<n;++i){
        scanf("%d%d%d",&b,&c,&d);
        a[i<<1]=mp(c,b); a[i<<1|1]=mp(d,-b);//拆成2个坐标
    }n<<=1;sort(a,a+n);
    s.insert(0);
    for(int i = 0, j; i < n; i = j){
        for(j=i;j < n;++j){
            if(a[i].fi!=a[j].fi) break;
            if(a[j].se>0) s.insert(a[j].se);
            else s.erase(s.find(-a[j].se));
        }H=*s.rbegin();//s.rbegin():指向s的最后一个元素
        if(h!=H){
            f[++tot]=mp(a[i].fi,h);
            f[++tot]=mp(a[i].fi,H);
            h=H;
        }
    }printf("%d
",tot);
    for(int i=1;i<=tot;++i)
        printf("%d %d
",f[i].fi,f[i].se);
    return 0;
}
原文地址:https://www.cnblogs.com/kafuuchino/p/10342467.html