线段树pts求条
查看原帖
线段树pts求条
752094
MornHus楼主2023/11/17 16:12
#include<bits/stdc++.h>
using namespace std;
#define maxt 1000005
#define maxn 25010
int n,t;
int dp[4000010];

struct node{
    int l,r;
}ran[maxn];

bool cmp(node a,node b){
    if(a.r!=b.r)return a.r<b.r;
    else return a.l<b.l;
}

void pushup(int now){
    dp[now]=min(dp[now<<1],dp[now<<1|1]);
}

void build(int now,int l,int r){
    if(l==r){
        dp[now]=1e9;
        return ;
    }else{
        int mid=(l+r)>>1;
        build(now<<1,l,mid);
        build(now<<1|1,mid+1,r);
        pushup(now);
    }
}

void update(int now,int l,int r,int tar,int val){
    if(l==r&&l==tar){
        dp[now]=val;
        return ;
    }else{
        int mid=(l+r)>>1;
        if(tar<=mid&&tar>=l){
            update(now<<1,l,mid,tar,val);
        }else{
            update(now<<1|1,mid+1,r,tar,val);
        }
        pushup(now);
    }
}

int query(int now,int l,int r,int L,int R){
    if(L<=l&&r<=R){
        return dp[now];
    }else{
        int mid=(l+r)>>1;
        int ans=1e9;
        if(L<=mid){
            ans=min(ans,query(now<<1,l,mid,L,R));
        }
        if(R>mid){
            ans=min(ans,query(now<<1|1,mid+1,r,L,R));
        }
        return ans;
    }
}

int main(){
    cin>>n>>t;
    build(1,0,t);
    for(int i=1;i<=n;i++){
        cin>>ran[i].l>>ran[i].r;
        if(ran[i].l==1){
            update(1,1,t,ran[i].r,1);
        }
    }
    sort(ran+1,ran+n+1,cmp);
    for(int i=1;i<=n;i++){
        int p=min(query(1,1,t,ran[i].l-1,ran[i].r-1)+1,query(1,1,t,ran[i].r,ran[i].r));
        update(1,1,t,ran[i].r,p);
    }
    int p=query(1,1,t,t,t);
    if(t==1e9)cout<<-1;
    else cout<<p;
    return 0;
}
2023/11/17 16:12
加载中...