您需要寫一種資料結構(可參考題目標題),來維護一些數,其中需要提供以下操作:
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 #include3using
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的後繼 後...