分析:求轮廓线
对于multiset S,S.erase(n)表示擦除所有n,S.erase(S.find(n))表示擦除其中1个n
#include<cstdio>
#include<set>
#include<algorithm>
using namespace std;
const int N=100002;
template <class T>
inline bool scan_d(T &ret){
char c; int sgn;
if(c=getchar(),c==EOF) return 0;
while(c!='-'&&(c<'0'||c>'9')) c=getchar();
sgn=(c=='-')?-1:1;
ret=(c=='-')?0:(c-'0');
while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');
ret*=sgn;
return 1;
}
inline void out(int x){
if(x<0){putchar('-');x=-x;}
if(x>9)out(x/10);
putchar(x%10+'0');
}
struct line{
int x,h;
bool operator<(line p)const{return x<p.x;}
}a[N<<1];
int x[N<<2],y[N<<2];
multiset<int> S;
multiset<int>::iterator it;
int main(){
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
int n,nn,i,h,l,r,max,cnt;
while(scan_d(n)){
S.clear();
for(i=0;i<n;i++){
scan_d(h),scan_d(l),scan_d(r);
a[i<<1].x=l,a[i<<1|1].x=r;
a[i<<1].h=h,a[i<<1|1].h=-h;
}nn=n<<1;
sort(a,a+nn);
S.insert(0);
x[0]=a[0].x,y[0]=0,cnt=1;
for(i=0;i<nn;i++){
if(a[i].h>0)S.insert(a[i].h);
else S.erase(S.find(-a[i].h));
if(i==nn-1||a[i].x!=a[i+1].x){
it=S.end();
max=*--it;
if(max!=y[cnt-1]){
x[cnt]=a[i].x,y[cnt]=y[cnt-1],cnt++;
x[cnt]=a[i].x,y[cnt]=max,cnt++;
}
}
}
out(cnt-1),putchar('\n');
for(i=1;i<cnt;i++)out(x[i]),putchar(' '),out(y[i]),putchar('\n');
}
return 0;
}