3224 Tyvj 1728 普通平衡樹

2022-05-16 05:40:56 字數 1825 閱讀 1960

time limit: 10 sec  memory limit: 128 mb

submit: 22215  solved: 9975

[submit][status][discuss]

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

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.每個數的資料範圍:[-2e9,2e9]

1 #include2 #include3 #include4

using

namespace

std;56

struct

treap

7tree[100005

];10

intn,size,root,ans;

1112

void update(int

k)13

1617

void lturn(int &k)

1826

27void rturn(int &k)

2836

37void insert(int &k,int

x)38

47 tree[k].size++;

48if(tree[k].val==x) tree[k].w++;

49else

if(x>tree[k].val)

5054

else

5559}60

61void del(int &k,int

x)62

71if(tree[k].left*tree[k].right==0) k=tree[k].left+tree[k].right;

72else

if(tree[tree[k].left].rnd73else

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

75else

7681}82

83int query_rank(int k,int

x)84

9192

int query_num(int k,int

x)93

101102

void query_pro(int k,int

x)103

110else

query_pro(tree[k].left,x);

111}

112113

void query_sub(int k,int

x)114

121else

query_sub(tree[k].right,x);

122}

123124

intmain()

125140

}141

return0;

142 }

3224 Tyvj 1728 普通平衡樹

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

bzoj 3224,tyvj 1728普通平衡樹

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

BZOJ 3224 Tyvj 1728 普通平衡樹

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