模板 普通平衡樹 Treap

2021-08-11 06:45:28 字數 1956 閱讀 4911

題目描述

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

1.插入x數

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

3.查詢x數的排名(排名定義為比當前數小的數的個數+1。若有多個相同的數,因輸出最小的排名)

4.查詢排名為x的數

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

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

輸入輸出格式

輸入格式:

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

輸出格式:

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

輸入輸出樣例

輸入樣例#1:

10 1 106465

4 1

1 317721

1 460929

1 644985

1 84185

1 89851

6 81968

1 492737

5 493598

輸出樣例#1:

106465

84185

492737

說明時空限制:1000ms,128m

1.n的資料範圍: n≤100000

2.每個數的資料範圍: [-^7, ^7]

卡了我一星期的資料結構,今天終於a了一題,感覺可以歡呼一下。。。

大概有以下幾個錯誤:

1.忘記判斷 o == null

2.cmp搞錯(就是這東西特別難查)

3.忘記更新子節點個數

下面是風格越發奇怪的**(大多數是大白書上學來的)

#include

#include

#include

#include

#include

using namespace std;

const

int n=100010,inf=10000010;

int n;

struct node

bool operator < (const node& rhs) const

int cmp(int x)

void maintain()

};node* rt=null;

void rotate(node* &o,int d)

void ins(node* &o,int x)

int d=(x < o->v ? 0 : 1);ins(o->ch[d],x);

if(o->ch[d] > o) rotate(o,d^1);

o->maintain();

}void del(node* &o,int x)

else

}else del(o->ch[d],x);

if(o != null) o->maintain();

}int kth(node *o,int k)

void rank(node *o,int x,int &ans,int k)

if(o->v == x) ans=min(ans,k+ss+1);

rank(o->ch[0],x,ans,k);

}void pre(node* o,int x,int &ans)

pre(o->ch[0],x,ans);

}void post(node* o,int x,int &ans)

post(o->ch[1], x, ans);

}int read()

while(c >= '0' && c <= '9')

return out*f;

}void solve()

if(opt == 5)

if(opt == 6)

}}int main()

Treap 普通平衡樹

最近學習了treap,找了道題目做做 全抄hz.因為普通的二叉樹,會退化成鏈 所以你把讀入打亂順序再構造二叉樹,就明顯卡不掉 平平均深度logn treap就是這樣的 在插入乙個數時,我們搞乙個rnd,賦值隨機 然後如果當前的這個節點rnd小於其父節點,那麼就把他轉到父節點的位置 這樣好比是給這個節...

treap 普通平衡樹

插入數值x。刪除數值x 若有多個相同的數,應只刪除乙個 查詢數值x的排名 若有多個相同的數,應輸出最小的排名 查詢排名為x的數值。求數值x的前驅 前驅定義為小於x的最大的數 求數值x的後繼 後繼定義為大於x的最小的數 注意 資料保證查詢的結果一定存在。輸入格式 第一行為n,表示操作的個數。接下來n行...

平衡樹模板 Treap

演算法標籤 treap 種下第一棵平衡樹 這是一道模板題。如果覺得這個題水的可以做一下4544壓行,是千古神犇花爸爸出的神犇題。您需要寫一種資料結構 可參考題目標題,但是這句話其實並沒有什麼用233 來維護一些數,其中需要提供以下操作 1.插入x數 2.刪除x數 若有多個相同的數,因只刪除乙個 3....