无旋treap hfq-treap

Posted bluefly-hrbust

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无旋treap hfq-treap相关的知识,希望对你有一定的参考价值。

怎么代码都这么长。。。

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<random>
using namespace std;
const int maxn = 1e5+5;
struct node
   int l,r;
   int val,key;
   int size;
fhq[maxn];
int cnt,root;
std::mt19937 rnd(233);
inline int newnode(int val)

    fhq[++cnt].val=val;
    fhq[cnt].key=rnd();
    fhq[cnt].size=1;
    return cnt;

inline void update(int now)

    fhq[now].size=fhq[fhq[now].l].size+fhq[fhq[now].r].size+1;

///分裂
void split(int now,int val,int &x,int &y)

    ///当前节点不存在
    if(!now)x=y=0;
    else
    
        ///如果当前节点的值是小于val
        ///那么这个当前节点的左子树也归到val
        ///我们把x=now相当于把这个点连接到分裂出来比这个值小的树
        ///然后我们取递归分裂这个树的右子树
        ///由于当前节点归到了小于的节点 但是这个接待那的右节点仍然需要重建
        if(fhq[now].val<=val)
        
            x=now;
        ///右子树还有往下分裂
            split(fhq[now].r,val,fhq[now].r,y);
        else 

            y=now;
            split(fhq[now].l,val,x,fhq[now].l);
        
        update(now);
    

int merge(int x,int y)

    if(!x||!y)return x+y;
    ///如果x的索引是大于y
    ///当前不满足二叉搜索树的形状,那么我们继续合并x的右子树
    if(fhq[x].key>fhq[y].key)
    
        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;
    

int x,y,z;
inline void ins(int val)

    split(root,val,x,y);
    root=merge(merge(x,newnode(val)),y);

inline void del(int val)

    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);

inline void getrank(int val)

    split(root,val-1,x,y);
    printf("%d\n",fhq[x].size+1);
    root=merge(x,y);

inline void getnum(int rank)

    int now=root;
    while(now)
    
        if(fhq[fhq[now].l].size+1==rank)
            break;
        else if(fhq[fhq[now].l].size>=rank)
            now=fhq[now].l;
        else
        
            rank-=fhq[fhq[now].l].size+1;
            now=fhq[now].r;
        
    
    printf("%d\n",fhq[now].val);

inline void pre(int val)

    split(root,val-1,x,y);
    int now=x;
    while(fhq[now].r)
       now=fhq[now].r;
    printf("%d\n",fhq[now].val);
    root=merge(x,y);

inline void net(int val)

    split(root,val,x,y);
    int now = y;
    while(fhq[now].l)
        now=fhq[now].l;
    printf("%d\n",fhq[now].val);
    root=merge(x,y);

int main()
  int t;
  int op;
  int val;
  cnt=0;
  scanf("%d",&t);
  while(t--)
    scanf("%d%d",&op,&val);
    if (op==1)
        ins(val);
    else if (op==2)
        del(val);
    else if (op==3)
        getrank(val);
    else if (op==4)
        getnum(val);
    else if (op==5)
        pre(val);
    else 
        net(val);
    
  
  return 0;

 

以上是关于无旋treap hfq-treap的主要内容,如果未能解决你的问题,请参考以下文章

无旋treap hfq-treap

无旋Treap

模板 - 数据结构 - 无旋Treap / FHQ Treap

[您有新的未分配科技点]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)

无旋treap

无旋treap板子!