Tyvj P1728 普通平衡樹 平衡樹

2021-07-02 21:33:46 字數 3315 閱讀 9561

題目鏈結

p1728普通平衡樹

此為平衡樹系列第一道:普通平衡樹

1. 插入x數

2. 刪除x數(若有多個相同的數,因只刪除乙個)

3. 查詢x數的排名(若有多個相同的數,因輸出最小的排名)

4. 查詢排名為x的數

5. 求x的前驅(前驅定義為小於x,且最大的數)

6. 求x的後繼(後繼定義為大於x,且最小的數)

第一行為n,表示操作的個數,下面n行每行有兩個數opt和x,opt表示操作的序號(1<=opt<=6)

對於操作3,4,5,6每行輸出乙個數,表示對應答案

8

1 10

1 20

1 30

3 20

4 2

2 10

5 25

6 -1

2

20

20

20

n<=100000 所有數字均在-10^7到10^7內

題解:平衡樹的基礎操作。

treap**:

#include#include#include#include#include#include#include#define nn 210000

#define eps 1e-8

#define inff 0x7fffffff

#define lson rt<<1,l,m

#define rson rt<<1|1,m+1,r

#define mod 20071027

using namespace std;

typedef long long ll;

typedef unsigned long long llu;

struct multi_treap

void update(node* o)//更新以該節點為根的數的個數

void rotate(node* &o,int d)//d為0左旋,d為1右旋

void insert(node* &o,int x)//插入x

int d=o->cmp(x);

if(d==-1)

insert(o->ch[d],x);

if(o->ch[d]->r>o->r)

update(o);

}void remove(node* &o,int x)//刪除x

else if(o->ch[1]==null)

else

}else

o->cnt--;

}else

remove(o->ch[d],x);

update(o);

}int rank(node *o,int x)//查詢x的排名

else if(o->vch[0])+o->cnt;

o=o->ch[1];

}else

}return ans;

}int kth(node *o,int x)//查詢排名為x的數

int pre(node* o,int x)//查詢x的前驅

else

o=o->ch[0];

}return ans;

}int suc(node* o,int x)//查詢x的後繼

else

o=o->ch[1];

}return ans;

}void de(node* o)//清空

}tp;

int main()

else if(x==2)

else if(x==3)

else if(x==4)

else if(x==5)

else

printf("%d\n",tp.suc(tp.root,y));

}tp.de(tp.root);

}return 0;

}

splay

#include#include#includeconst int inf=0x3fffffff;

using namespace std;

struct node

*root;

void display(node* o)

int numof(node* o)

void update(node* o)

void rotate(node* o)

o->pre=tem->pre;

o->ch[d^1]=tem;

tem->pre=o;

update(tem);

//update(o);伸展完以後再更新,減少常數

}void splay(node* o,node* f)

else}}

update(o);

if(f==null)

root=o;

}void insert(node* &o,node* pre,int val)

if(val==o->val)

else if(valval)

insert(o->ch[0],o,val);

else

insert(o->ch[1],o,val);

}node* pre(node* o,int val)

else

o=o->ch[0];

}return re;

}node* suc(node* o,int val)

else

o=o->ch[1];

}return re;

}void remove(node* o,int val)

splay(y,null);

}else if(valval)

remove(o->ch[0],val);

else

remove(o->ch[1],val);

}int rank(node* o,int val)

else if(valval)

else

return numof(o->ch[0])+o->num+rank(o->ch[1],val);

}int kth(node* o,int k)

void clear(node* o)

int main()

else if(d==2)

else if(d==3)

else if(d==4)

else if(d==5)

else

}clear(root);

}return 0;

}

Tyvj 1728 普通平衡樹

hysbz 3224 tyvj 1728 普通平衡樹 time limit 10000ms memory limit 131072kb 64bit io format lld llu submit status use mathjax to parse formulas description 您需...

Tyvj 1728 普通平衡樹

time limit 10 sec memory limit 128 mb submit 13242 solved 5675 submit status discuss 您需要寫一種資料結構 可參考題目標題 來維護一些數,其中需要提供以下操作 1.插入x數 2.刪除x數 若有多個相同的數,因只刪除乙...

Tyvj 1728 普通平衡樹

您需要寫一種資料結構 可參考題目標題 來維護一些數,其中需要提供以下操作 1.插入x數 2.刪除x數 若有多個相同的數,因只刪除乙個 3.查詢x數的排名 若有多個相同的數,因輸出最小的排名 4.查詢排名為x的數 5.求x的前驅 前驅定義為小於x,且最大的數 6.求x的後繼 後繼定義為大於x,且最小的...