Treep 全部MLE??????

P6136 【模板】普通平衡树(数据加强版)

_Revenge_ @ 2022-09-25 19:40:53

是哪里写错了吗? 还是说空间卡的太ex.

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef double db;

const int N=2e5+50;
const int M=1e5+50;
const int Mod=1e9+7;
const int Inf=INT_MAX;

inline int read(){
    int x=0,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();
    }
    return x*f;
}

int sum=0,root=0;

int num[N],v[N],rd[N],son[N][2],siz[N];

void push_up(int p){
    siz[p]=siz[son[p][0]]+siz[son[p][1]]+num[p];
}

void rotate(int &p,int d){
    int k=son[p][d^1];
    son[p][d^1]=son[k][d];
    son[k][d]=p;
    push_up(p);
    push_up(k);
    p=k;
}

void ins(int &p,int x){
    if(!p){
        ++sum;
        p=sum;
        num[p]=siz[p]=1;
        rd[p]=rand();
        v[p]=x;
        return;
    }
    if(v[p]==x){
        siz[p]++;
        num[p]++;
        return;
    }
    int d=x>v[p];
    ins(son[p][d],x);
    if(rd[p]<rd[son[p][d]]) rotate(p,d^1);
    push_up(p);
}

void del(int &p,int x){
    if(!p) return;
    if(v[p]>x) del(son[p][0],x);else 
    if(v[p]<x) del(son[p][1],x);else{
        if(!son[p][0]&&!son[p][1]){
            num[p]--;siz[p]--;
            if(!num[p]) p=0;
        }else
        if(!son[p][0]&&son[p][1]){
            rotate(p,0);
            del(son[p][0],x);
        }else
        if(son[p][0]&&!son[p][1]){
            rotate(p,1);
            del(son[p][1],x);
        }else{
            int d=rd[son[p][0]]>rd[son[p][1]];
            rotate(p,d);
            del(son[p][d],x);
        }
    } 
    push_up(p);
}

int rk(int p,int x){
    if(!p) return 1;
    if(x==v[p]) return siz[son[p][0]]+1;
    if(x<v[p]) return rk(son[p][0],x); else
    if(x>v[p]) return siz[son[p][0]]+num[p]+rk(son[p][1],x);
}

int fd(int p,int x){
    if(!p) return 0;
    if(siz[son[p][0]]>=x) return fd(son[p][0],x); else
    if(siz[son[p][0]]+num[p]<x)
        return fd(son[p][1],x-siz[son[p][0]]-num[p]);
    else 
        return v[p];
}

int pre(int p,int x){
    if(!p) return -Inf;
    if(v[p]>=x) return pre(son[p][0],x);
    else return max(v[p],pre(son[p][1],x));
}

int suc(int p,int x){
    if(!p) return Inf;
    if(v[p]<=x) return suc(son[p][1],x);
    else return min(v[p],suc(son[p][0],x));
}

int n,m;

int main()
{
    srand(time(NULL));
    n=read(),m=read();
    for(int i=1;i<=n;++i) ins(root,read());
    int ans=0,last=0;
    while(m--){
        int opt=read(),x=read();
        x^=last;
        if(opt==1) ins(root,x); else
        if(opt==2) del(root,x); else
        if(opt==3) last=rk(root,x); else
        if(opt==4) last=fd(root,x); else
        if(opt==5) last=pre(root,x); else
        if(opt==6) last=suc(root,x); 
        if(opt>=3) ans^=last;
    }
    printf("%d\n",ans);
    return 0;
}

by Zvelig1205 @ 2022-09-25 19:54:51

《Treep》


by CH_mengxiang @ 2022-09-25 19:58:35

@PRC_Dreamwastaken 另外这个叫Treap


by CH_mengxiang @ 2022-09-25 19:59:04

注意数据范围,由于最大1e6的m次操作中有插入操作,因此数组至少要开到1e6+1e5+1

实测你的N改成1e5+1e6+1后满分


by _Revenge_ @ 2022-09-25 20:08:18

az ,我以为 Tree+heap=Treep


by juruo999 @ 2022-09-25 20:31:27

@Revenge 《Treep》死因:数组开小了


|