线段树TLE80 求助
  • 板块P1382 楼房
  • 楼主zhoumurui
  • 当前回复3
  • 已保存回复3
  • 发布时间2025/6/29 22:20
  • 上次更新2025/6/30 20:06:53
查看原帖
线段树TLE80 求助
305928
zhoumurui楼主2025/6/29 22:20

如题。

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;
}
2025/6/29 22:20
加载中...