求调,玄关
查看原帖
求调,玄关
381643
Stairs_upon_temple楼主2024/7/26 21:37
/*
g++ -o2 P2343.cpp -o2 c -std=c++14
.\c

*/

#include<algorithm>
#include<cstring>
#include<cstdio>

using namespace std;

const int N=5e6+100;
const int inf=0x7fffffff;

struct dot{
    int l,r;
    bool operator < (const dot &hh)const{
        if(r==hh.r)return l < hh.l;
        return r < hh.r;
    }
}s[N];

struct node{
    int v,p;
    int s[2];
    int siz;
    void init(int _v,int _p){
        v=_v;
        p=_p;
        siz=1;
    }
}t[N];

int tot;
int root;

void pushup(int x){
    t[x].siz=t[t[x].s[0]].siz+t[t[x].s[1]].siz+1;
    return ;
}

void rotate(int x){
    int y=t[x].p;
    int z=t[y].p;
    int k=t[y].s[1]==x;
    t[z].s[t[z].s[1]==y]=x;
    t[x].p=z;
    t[y].s[k]=t[x].s[k^1];
    t[t[x].s[k^1]].p=y;
    t[x].s[k^1]=y;
    t[y].p=x;
    pushup(y);
    pushup(x);
    return ;
}

void splay(int x,int k){
    while(t[x].p!=k){
        int y=t[x].p;
        int z=t[y].p;
        if(z!=k){
            if((t[z].s[1]==y)^(t[y].s[1]==x))rotate(x);
            else rotate(y);
        }
        rotate(x);
    }
    if(!k)root=x;
    return ;
}

int insert(int v){
    int u=root;
    int p=0;
    while(u){
        p=u;
        u=t[u].s[v>t[u].v];
    }
    u=++tot;
    if(p)t[p].s[v>t[p].v]=u;
    t[u].init(v,p);
    splay(u,0);
    return u;
}


void find(int v){
    int u=root;
    if(!u)return ;
    while(t[u].s[v>t[u].v] && v!=t[u].v){
        u=t[u].s[v>t[u].v];
    }
    splay(u,0);
    return ;
}

int get_pre(int v){
    find(v);
    int u=root;
    if(t[u].v<v)return u;
    u=t[u].s[0];
    while(t[u].s[1])u=t[u].s[1];
    return u;
}

int get_nex(int v){
    find(v);
    int u=root;
    if(t[u].v>v)return u;
    u=t[u].s[1];
    while(t[u].s[0])u=t[u].s[0];
    return u;
}

void remove(int v){
    int pre=get_pre(v);
    int nex=get_nex(v);
    splay(pre,0);
    splay(nex,pre);
    t[nex].s[0]=0;
    return ;
}

int n,m;
int num[N];

int main(){
    scanf("%d%d",&n,&m);
    // if(m>=n){
    //     printf("0\n");
    //     return 0;
    // }
    insert(-inf);
    insert( inf);
    for(int i=1;i<=m;i++)insert(0);
    for(int i=1;i<=n;i++){
        scanf("%d%d",&s[i].l,&s[i].r);
    }
    sort(s+1,s+n+1);
    // for(int i=1;i<=n;i++){
    //     printf("%d %d \n",s[i].l,s[i].r);
    // }
    int ans=0;
    for(int i=1;i<=n;i++){
        int pre=get_pre(s[i].l+1);
        int cnt=t[pre].v;
        // printf("%d %d \n",cnt,s[i].l+1);
        if(t[pre].v==-inf)ans++;
        else{
            remove(t[pre].v);
            insert(s[i].r);
        }
    }
    printf("%d\n",ans+1);
    return 0;
}
2024/7/26 21:37
加载中...