BZOJ3224 普通平衡樹

2021-07-14 19:01:04 字數 1222 閱讀 5474

題目傳送門

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

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

這道題很明顯要用二叉排序樹來進行操作,其實是裸題。不過以前沒打過splay,考試時教練讓我們打splay。沒打出來,調了一晚上也沒調出來。wwwww。熬夜打了乙個treap,還要上課啊。。。。。補覺了。

#include #include #include #include #include using namespace std;

const int maxn = 101111;

struct node n[maxn];

int totn, root;

const int inf = 1 << 30;

void up(int u)

void rot(int &u, int d)

void ins(int& u,int val) else

ins(n[u].ch[k], val);

if (n[n[u].ch[k]].r > n[u].r) rot(u, k ^ 1); }}

void del(int& u,int val)

if (!n[u].ch[0] || !n[u].ch[1]) u = n[u].ch[0] + n[u].ch[1];

else

} else --n[u].s, del(n[u].ch[val < n[u].v ? 0 : 1],val);

}int rank(int u, int val)

int kth(int u,int k)

int pred(int u, int val)

int succ(int u, int val)

int main()

return 0;

}

附:在網上看見了乙個模板,把splay,treap和sbt的做法打了出來。

傳送門在這裡

bzoj3224普通平衡樹

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