P7391 50pts求助
  • 板块题目总版
  • 楼主Kketchup
  • 当前回复4
  • 已保存回复4
  • 发布时间2022/11/25 16:57
  • 上次更新2023/10/27 01:33:53
查看原帖
P7391 50pts求助
551760
Kketchup楼主2022/11/25 16:57

fhq-treap 50pts求助qwq

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<random>
#include<ctime>
using namespace std;
mt19937 rd(time(NULL));
namespace IO{
    template<typename T> inline static void read(T &x){x=0;int f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}if(f==-1) x=-x;}
    template<typename T,typename ...Args> inline static void read(T& x,Args& ...args){read(x);read(args...);}
    template<typename T> inline static void write(char c,T x){T p=x;if(!p) putchar('0');if(p<0){putchar('-');p=-p;}int cnt[105],tot=0;while(p){cnt[++tot]=p%10;p/=10;}for(int i=tot;i>=1;i--){putchar(cnt[i]+'0');}putchar(c);}
    template<typename T,typename ...Args> inline static void write(const char c,T x,Args ...args){write(c,x);write(c,args...);}
};
const int N=2e5+10;
const int INF=0x7fffffff;
int n,m;
int ans;
struct node{int l,r;}a[N];
struct fhq{int size,key,val,l,r;}t[N];
inline bool cmp(node a,node b){
    if(a.r==b.r) return a.l<b.l;
    return a.r<b.r;
}
int root,cnt;
inline void init(int &k,int _key){t[++cnt].size=1,t[cnt].l=t[cnt].r=0,t[cnt].key=_key,t[cnt].val=rd(),k=cnt;}
inline void pushup(int p){t[p].size=t[t[p].l].size+t[t[p].r].size+1;}
void split(int p,int _key,int &x,int &y){
    if(!p) x=y=0;
    else if(t[p].key<=_key){
        split(t[p].r,_key,t[p].r,y);
        pushup(p),x=p;
    }else{
        split(t[p].l,_key,x,t[p].l);
        pushup(p),y=p;
    }
}
int merge(int x,int y){
    if(!x||!y) return x+y;
    if(t[x].val<t[y].val){
        t[x].r=merge(t[x].r,y);
        pushup(x);return x;
    }else{
        t[y].l=merge(x,t[y].l);
        pushup(y);return y;
    }
}
inline void insert(int &root,int key){
    int x=0,y=0,z=0;
    split(root,key,x,y),init(z,key),root=merge(merge(x,z),y);
}
inline void del(int &root,int _key){
    int x=0,y=0,z=0;
    split(root,_key,x,y),split(x,_key-1,x,z),z=merge(t[z].l,t[z].r),root=merge(merge(x,z),y);
}
int getval(int p,int _key){
    while(1){
        if(t[t[p].l].size+1==_key) return t[p].key;
        else if(t[t[p].l].size+1<_key) _key=_key-t[t[p].l].size-1,p=t[p].r;
        else p=t[p].l;
    }
}
inline int prev(int &root,int _key){
    int x=0,y=0;
    split(root,_key-1,x,y);
    if(!x) return -INF;
    int pre=getval(x,t[x].size);
    root=merge(x,y);
    return pre;
}
inline int next(int &root,int _key){
    int x=0,y=0;
    split(root,_key,x,y);
    if(!y) return INF;
    int nex=getval(y,1);
    root=merge(x,y);
    return nex;
}
int main(){
    IO::read(n,m);
    for(int i=1;i<=n;++i) IO::read(a[i].l,a[i].r);
    sort(a+1,a+1+n,cmp);
    for(int i=1;i<=n;++i){
        if(m){
            m--,insert(root,a[i].r);
            continue;
        }
        if(next(root,-INF)<=a[i].l){
            del(root,next(root,-INF));
            insert(root,a[i].r);
            continue;
        }
        ans++;
        if(prev(root,INF)>a[i].r){
            del(root,prev(root,INF));
            insert(root,a[i].r);
        }
    }
    IO::write('\n',ans);
    return 0;
}
2022/11/25 16:57
加载中...