【fhq-treap】P3369 【模板】普通平衡树 & P3391 【模板】文艺平衡树

 

 fhq-treap基本操作

 

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int t;
struct fhq_treap
{
    int l,r,v,rnd,siz;
}fhq[maxn];
int tot,root;
int newnode(int val)
{
    ++tot;
    fhq[tot].v=val; fhq[tot].rnd=rand();
    fhq[tot].siz=1;
    return tot;
}
void update(int x)
{
    fhq[x].siz=fhq[fhq[x].l].siz+fhq[fhq[x].r].siz+1;
}
void split(int now,int k,int &x,int &y)
{
    if(!now) x=0,y=0;
    else
    {
        if(fhq[now].v<=k)
        {
            x=now;
            split(fhq[now].r,k,fhq[now].r,y);
        }
        else
        {
            y=now;
            split(fhq[now].l,k,x,fhq[now].l);
        }
        update(now);
    }
}
int merge(int x,int y)
{
    if(!x || !y) return x+y;
    if(fhq[x].rnd<=fhq[y].rnd)
    {
        fhq[x].r=merge(fhq[x].r,y);
        update(x);
        return x;
    }
    else
    {
        fhq[y].l=merge(x,fhq[y].l);
        update(y);
        return y;
    }
}
void add(int val)
{
    int x,y;
    split(root,val,x,y);
    root=merge(merge(x,newnode(val)),y);
}
void del(int val)
{
    int x,y,z;
    split(root,val,x,z);
    split(x,val-1,x,y);
    y=merge(fhq[y].l,fhq[y].r);
    root=merge(merge(x,y),z);
}
void getrank(int val)
{
    int x,y;
    split(root,val-1,x,y);
    printf("%d\n",fhq[x].siz+1);
    root=merge(x,y);
}
void get(int val)
{
    int now=root;
    while(now)
    {
        if(fhq[fhq[now].l].siz+1==val) break;
        else 
            if(fhq[fhq[now].l].siz+1>val) now=fhq[now].l;
            else
            {
                val-=fhq[fhq[now].l].siz+1;
                now=fhq[now].r;
            }
    }
    printf("%d\n",fhq[now].v);
}
void pre(int val)
{
    int x,y;
    split(root,val-1,x,y);
    int now=x;
    while(fhq[now].r) now=fhq[now].r;
    printf("%d\n",fhq[now].v);
    root=merge(x,y);
}
void nxt(int val)
{
    int x,y;
    split(root,val,x,y);
    int now=y;
    while(fhq[now].l) now=fhq[now].l;
    printf("%d\n",fhq[now].v);
    root=merge(x,y); 
}
int main()
{
//    freopen("a.in","r",stdin);
//    freopen("a.out","w",stdout);
    scanf("%d",&t);
    while(t--)
    {
        int op,x;
        scanf("%d%d",&op,&x);
        if(op==1) add(x);
        if(op==2) del(x);
        if(op==3) getrank(x);
        if(op==4) get(x);
        if(op==5) pre(x);
        if(op==6) nxt(x);
    }
    return 0;
} 

 

 

文艺平衡树

 

代码

#include<bits/stdc++.h>
using namespace std;
int n,m;
const int maxn=1e5+5;
struct fhq_treap
{
    int l,r,v,siz,rnd,lz;
}fhq[maxn];
int root,tot;
int newnode(int val)
{
    ++tot;
    fhq[tot].siz=1; fhq[tot].v=val;
    fhq[tot].rnd=rand();
    return tot;
}
void update(int now)
{
    fhq[now].siz=fhq[fhq[now].l].siz+fhq[fhq[now].r].siz+1;
}
void pushdown(int now)
{
    if(!fhq[now].lz) return;
    swap(fhq[now].l,fhq[now].r);
    fhq[fhq[now].l].lz^=1;
    fhq[fhq[now].r].lz^=1;
    fhq[now].lz=0;
    return;
}
void split(int now,int k,int &x,int &y)
{
    if(!now) x=y=0;
    else
    {
        pushdown(now);
        if(fhq[fhq[now].l].siz<k)
        {
            x=now;
            split(fhq[now].r,k-fhq[fhq[now].l].siz-1,fhq[now].r,y);
        }
        else
        {
            y=now;
            split(fhq[now].l,k,x,fhq[now].l);
        }
        update(now);
    }
}
int merge(int x,int y)
{
    if(!x || !y) return x+y;
    if(fhq[x].rnd<=fhq[y].rnd)
    {
        pushdown(x);
        fhq[x].r=merge(fhq[x].r,y);
        update(x);
        return x;
    }
    else
    {
        pushdown(y);
        fhq[y].l=merge(x,fhq[y].l);
        update(y);
        return y;
    }
}
void reverse(int l,int r)
{
    int x,y,z;
    split(root,l-1,x,y);
    split(y,r-l+1,y,z);
    fhq[y].lz^=1;
    root=merge(merge(x,y),z);
}
void ldr(int now)
{
    if(!now) return;
    pushdown(now);
    ldr(fhq[now].l);
    printf("%d ",fhq[now].v);
    ldr(fhq[now].r);
}
int main()
{
    freopen("a.in","r",stdin);
    freopen("a.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        root=merge(root,newnode(i));
    for(int i=1;i<=m;i++)
    {
        int l,r;
        scanf("%d%d",&l,&r);
        reverse(l,r);
    }
    ldr(root);
    return 0;
}

 

posted @ 2020-12-13 13:46  andyc_03  阅读(76)  评论(0编辑  收藏  举报