zoukankan      html  css  js  c++  java
  • fhq Treap(无旋Treap)

    先吹一波fhq dalao,竟然和我一个姓,我真是给他丢脸。

    昨天treap就搞了一下午,感觉自己弱爆了。然后今天上午又看了一个上午的无旋treap再次懵逼,我太弱了,orzorz。

    所以写个博客防止自己忘了吧(其实就是贴个代码)

    其实fhq treap中最重要的操作就是split和merge,这样就避免了普通treap中的zig和zag,而且各种查询十分方便,基本查个排名就出来了。

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<cmath>
      5 #include<algorithm>
      6 #include<vector>
      7 using namespace std;
      8 const int N=1e5+10;
      9 int root,tot;
     10 struct Treap{
     11     int l,r,dat,val,size;
     12 }tr[N];
     13 void update(int p){tr[p].size=tr[tr[p].l].size+tr[tr[p].r].size+1;}
     14 int New(int val){
     15     int x=++tot;
     16     tr[x].val=val;
     17     tr[x].dat=rand();
     18     tr[x].size=1;
     19     return x;
     20 }
     21 void merge(int &root,int a,int b){
     22     if(!a||!b){
     23         root=a+b;
     24         return ;
     25     }
     26     if(tr[a].dat<tr[b].dat){//a shi baba
     27         root=a;
     28         merge(tr[root].r,tr[a].r,b);
     29     }
     30     else{
     31         root=b;
     32         merge(tr[root].l,a,tr[b].l);
     33     }
     34     update(root);
     35 }
     36 void split(int x,int &a,int &b,int val){
     37     if(!x){
     38         a=b=0;
     39         return ;
     40     }
     41     if(tr[x].val<=val){
     42         a=x;
     43         split(tr[x].r,tr[a].r,b,val);
     44     }
     45     else{
     46         b=x;
     47         split(tr[x].l,a,tr[b].l,val);
     48     }
     49     update(x);
     50 }
     51 int getrankbyval(int &root,int val){
     52     int x=0,y=0;
     53     split(root,x,y,val-1);
     54     int ans=tr[x].size+1;
     55     merge(root,x,y);
     56     return ans;
     57 }
     58 int getvalbyrank(int &root,int rank){
     59     int x=root;
     60     while(tr[tr[x].l].size+1!=rank){
     61         if(rank<=tr[tr[x].l].size) x=tr[x].l;
     62         else rank-=(tr[tr[x].l].size+1),x=tr[x].r;
     63     }
     64     return tr[x].val;
     65 }
     66 void insert(int &root,int val){
     67     int x=0,y=0;
     68     split(root,x,y,val);
     69     merge(x,x,New(val));
     70     merge(root,x,y);
     71 }
     72 void remove(int &root,int val){
     73     int x=0,y=0,z=0;
     74     split(root,x,y,val);
     75     split(x,x,z,val-1);
     76     merge(z,tr[z].l,tr[z].r);
     77     merge(x,x,z);
     78     merge(root,x,y);
     79 }
     80 int pre(int &root,int val){
     81     int x=0,y=0;
     82     split(root,x,y,val-1);
     83     int ans=getvalbyrank(x,tr[x].size);
     84     merge(root,x,y);
     85     return ans;
     86 }
     87 int next(int &root,int val){
     88     int x=0,y=0;
     89     split(root,x,y,val);
     90     int ans=getvalbyrank(y,1);
     91     merge(root,x,y);
     92     return ans;
     93 }
     94 int main(){
     95     int n;
     96     scanf("%d",&n);
     97     for(int i=1;i<=n;i++){
     98         int opt,x;
     99         scanf("%d%d",&opt,&x);
    100         if(opt==1) insert(root,x);
    101         else if(opt==2) remove(root,x);
    102         else if(opt==3) printf("%d
    ",getrankbyval(root,x));
    103         else if(opt==4) printf("%d
    ",getvalbyrank(root,x));
    104         else if(opt==5) printf("%d
    ",pre(root,x));
    105         else if(opt==6) printf("%d
    ",next(root,x));
    106     }
    107 }
    View Code

    明天考试,我好慌,我好慌。

    马上分机房,我肯定去菜机房了,我好慌,我好慌。

    加油吧,为了自己的梦想

    Mi corazón pertenece a Barcelona para siempre.

  • 相关阅读:
    ye间模式
    Xutilt网络获取数据
    JUnit
    IntelliJ IDEA快捷键
    Map存放不同数据或对象
    SQL改
    外键约束
    Hibernate之SQL语言查询
    Hibernate之Criteria语言查询
    Hibernate之HQL语言查询
  • 原文地址:https://www.cnblogs.com/leom10/p/11015089.html
Copyright © 2011-2022 走看看