bzoj3224普通平衡樹

2021-07-09 21:45:45 字數 1865 閱讀 4730

您需要寫一種資料結構(可參考題目標題),來維護一些數,其中需要提供以下操作:

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每行輸出乙個數,表示對應答案 10

1 106465

4 11 317721

1 460929

1 644985

1 84185

1 89851

6 81968

1 492737

5 493598

106465

84185

492737

1.n的資料範圍:n<=100000

2.每個數的資料範圍:[-1e7,1e7]

平衡樹明確告知你就是平衡樹。

寫乙個treap就好

#include#include#include#include#include#includeusing namespace std;

struct treap

t[100010];

int n,size,root,ans;

void update(int k);

void insert(int &k, int x);

void left_turn(int &k);

void right_turn(int &k);

int query_rank(int k, int x);

int query_num(int k, int x);

void query_pre(int k, int x);

void query_nst(int k, int x);

void del(int &k, int x);

int main()

}return 0;}

void update(int k)

void insert(int &k, int x)

t[k].size ++;

if(t[k].v == x) t[k].w ++;

else

if(x > t[k].v)

else

} void right_turn(int &k)

void left_turn(int &k)

int query_rank(int k, int x)

int query_num(int k, int x)

void query_pre(int k, int x)

else query_pre(t[k].l,x);}

void query_nst(int k, int x)

else query_nst(t[k].r,x); }

void del(int &k ,int x)

if(t[k].l * t[k].r == 0) k = t[k].l + t[k].r;

else

if(t[ t[k].l ].rnd < t[ t[k].r ].rnd) right_turn(k),del(k,x);

else left_turn(k),del(k,x);

}else if(t[k].v < x) t[k].size --,del(t[k].r,x);

else t[k].size --, del(t[k].l,x);

}

BZOJ3224 普通平衡樹

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

BZOJ3224 普通平衡樹

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

BZOJ 3224 普通平衡樹

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