无旋Treap本地通过测评MLE求助
查看原帖
无旋Treap本地通过测评MLE求助
416766
bnnnnn楼主2023/11/17 21:17

RT

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<stdlib.h>
using namespace std;

const int maxn=1e5+5;
int T,root;
struct FHQ
{
    int val,pri;
    int ls,rs;
    int siz;
    bool laz;
}fhq[maxn];
int tot;

int newnode(int val)
{
    fhq[++tot].val=val;
    fhq[tot].pri=rand();
    fhq[tot].ls=fhq[tot].rs=0;
    fhq[tot].siz=1;
    fhq[tot].laz=false;
    return tot;
}

void pushup(int rt)
{
    fhq[rt].siz=fhq[fhq[rt].ls].siz+fhq[fhq[rt].rs].siz+1;
}

void pushdown(int rt)
{
    if(!fhq[rt].laz) return;
    swap(fhq[rt].ls,fhq[rt].rs);
    fhq[fhq[rt].ls].laz^=1;
    fhq[fhq[rt].rs].laz^=1;
    fhq[rt].laz=0;
}

void Split(int rt,int val,int &x,int &y)
{
    if(!rt)
    {
        x=y=0;
        return;
    }
    pushdown(rt);
    if(fhq[rt].val<=val) {x=rt;Split(fhq[rt].rs,val,fhq[rt].rs,y);}
    else {y=rt;Split(fhq[rt].ls,val,x,fhq[rt].ls);}
    pushup(rt);
}

int Merge(int x,int y)
{
    if(!x||!y) return x+y;
    if(fhq[x].pri>fhq[y].pri)
    {
        pushdown(x);
        fhq[x].rs=Merge(fhq[x].rs,y);
        pushup(x);
        return x;
    }
    else
    {
        pushdown(y);
        fhq[y].ls=Merge(x,fhq[y].ls);
        pushup(y);
        return y;
    }
}

void Insert(int val)
{
    int x,y;
    Split(root,val,x,y);
    root=Merge(Merge(x,newnode(val)),y);
}

void Delet(int val)
{
    int x,y,z;
    Split(root,val,x,z);
    Split(root,val-1,x,y);
    y=Merge(fhq[y].ls,fhq[y].rs);
    root=Merge(Merge(x,y),z);
}

int qRank(int val)
{
    int x,y;
    Split(root,val-1,x,y);
    int res=fhq[x].siz+1;
    root=Merge(x,y);
    return res;
}

int qNum(int rk)
{
    int p=root;
    while(p)
    {
        if(fhq[fhq[p].ls].siz+1==rk) break;
        if(fhq[fhq[p].ls].siz>=rk) p=fhq[p].ls;
        else {rk-=fhq[fhq[p].ls].siz+1;p=fhq[p].rs;}
    }
    return fhq[p].val;
}

int qPre(int val)
{
    int x,y;
    Split(root,val-1,x,y);
    int p=x;
    while(fhq[p].rs) p=fhq[p].rs;
    int res=fhq[p].val;
    root=Merge(x,y);
    return res;
}

int qSuf(int val)
{
    int x,y;
    Split(root,val,x,y);
    int p=y;
    while(fhq[p].ls) p=fhq[p].ls;
    int res=fhq[p].val;
    root=Merge(x,y);
    return res;
}

int main()
{
    int opt,x;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&opt,&x);
        switch(opt)
        {
            case 1:
                Insert(x);
                break;
            case 2:
                Delet(x);
                break;
            case 3:
                printf("%d\n",qRank(x));
                break;
            case 4:
                printf("%d\n",qNum(x));
                break;
            case 5:
                printf("%d\n",qPre(x));
                break;
            case 6:
                printf("%d\n",qSuf(x));
                break;
        }
    }
    return 0;
}
2023/11/17 21:17
加载中...