每个矩形拆成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; }