如题。
TLE in #2,#10。其他点最慢 700ms,因此不确定是被卡常了还是死循环了。
#include<bits/stdc++.h>
using namespace std;
int n,h[5000005],l[5000005],r[5000005],lsh[5000005],cnt;
struct node{
int l,r,x,f;
}t[5000005];
void build(int rt,int l,int r){
t[rt].l=l;
t[rt].r=r;
if (l==r)return;
int mid=(l+r)/2;
build(rt*2,l,mid);
build(rt*2+1,mid+1,r);
}
void pushdown(int rt){
t[rt*2].f=max(t[rt*2].f,t[rt].f);
t[rt*2+1].f=max(t[rt*2+1].f,t[rt].f);
t[rt*2].x=max(t[rt*2].x,t[rt].f);
t[rt*2+1].x=max(t[rt*2+1].x,t[rt].f);
t[rt].f=0;
}
void add(int rt,int l,int r,int k){
if (l>r)return;
if (t[rt].l>r||t[rt].r<l)return;
if (t[rt].l>=l&&t[rt].r<=r){
t[rt].x=max(t[rt].x,k);
t[rt].f=max(t[rt].f,k);
}
pushdown(rt);
add(rt*2,l,r,k);
add(rt*2+1,l,r,k);
t[rt].x=max(t[rt*2].x,t[rt*2+1].x);
}
int V[5000005];
void find(int rt){
if (t[rt].l==t[rt].r){V[t[rt].l]=t[rt].x;return;}
pushdown(rt);
find(rt*2);
find(rt*2+1);
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n;
for (int i=1;i<=n;i++){
cin>>h[i]>>l[i]>>r[i];
lsh[++cnt]=l[i];
lsh[++cnt]=r[i];
}
sort(lsh+1,lsh+1+cnt);
cnt=unique(lsh+1,lsh+1+cnt)-lsh-1;
build(1,1,cnt);
for (int i=1;i<=n;i++){
l[i]=lower_bound(lsh+1,lsh+1+cnt,l[i])-lsh;
r[i]=lower_bound(lsh+1,lsh+1+cnt,r[i])-lsh;
add(1,l[i],r[i]-1,h[i]);
}
int x=0,y=0;
lsh[cnt+1]=lsh[cnt];
vector<pair<int,int> > v;
find(1);
for (int i=1;i<=cnt+1;i++){
x=lsh[i];
int ne=V[i];
if (ne!=y){
v.push_back({x,y});
v.push_back({x,ne});
y=ne;
}
}
cout<<v.size()<<"\n";
for (auto i:v)cout<<i.first<<" "<<i.second<<"\n";
return 0;
}