3224 Tyvj 1728 普通平衡樹

2022-05-14 05:24:31 字數 1600 閱讀 8946

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

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

101 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]

模板題

1 #include2 #include3

using

namespace

std;

4struct

treetr[1000001];7

intcnt,t1,t2,n,opt,x,root;

8void updata(int

k)12

13void lturn(int &k)

1718

void rturn(int &k)

2223

void insert(int &k,int

x)27 tr[k].s++;

28if (x32else

if (x>tr[k].num)

36else

if (x==tr[k].num) 40}

4142

void del(int &k,int

x)48

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

49else

if (tr[tr[k].l].rnd50rturn(k),del(k,x);

51else

lturn(k),del(k,x);52}

53else

if (x>tr[k].num) tr[k].s--,del(tr[k].r,x);

54else tr[k].s--,del(tr[k].l,x);55}

5657

int find1(int &k,int

x) 63

64int find2(int &k,int

x)71

72void pre(int &k,int

x)78

else

pre(tr[k].l,x);79}

8081

void after(int &k,int

x)87

else

after(tr[k].r,x);88}

8990

intmain()

103104

}105 }

3224 Tyvj 1728 普通平衡樹

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

bzoj 3224,tyvj 1728普通平衡樹

原題位址 這道題涵蓋了平衡樹的基本操作。先關注操作三,它指出要輸出最小的排名,因此我們可以將重複的元素存在乙個節點內,實現很簡單。插入操作已講。那麼怎樣刪除呢?首先我們找到被刪的點,如果它是重複的 該元素還剩很多個 那麼就把個數減一即可。否則我們可以採用像堆的方式,將這個元素通過旋轉不斷地下移。問題...

BZOJ 3224 Tyvj 1728 普通平衡樹

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