BZOJ3224 Tyvj 1728 普通平衡樹

2022-05-08 07:54:10 字數 2577 閱讀 2251

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

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]

資料如下

正解:splay or treap or 替罪羊樹

解題報告:

正解好多。

感覺寫的比較好的題解:(傳送門)

替罪羊樹:

treap:

我也用幾種演算法都寫了一遍。

替罪羊樹:

感覺就是優化暴力,唯一比二叉搜尋樹更優秀的就是刪除操作和重構操作,還是很神的。

**如下:(我的常數取得是0.75,事實上可以再大一點)  

1

//it is made by jump~

2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include

13#ifdef win32

14#define ot "%i64d"

15#else

16#define ot "%lld"

17#endif

18using

namespace

std;

19 typedef long

long

ll;20

const

int maxn = 200011;21

const

double a = 0.75;22

intn,root,tot;

23int ret;//

判斷是否需要重構

24int son[maxn][2

],w[maxn],del[maxn],size[maxn],zong[maxn];

25//

size記錄當前未被刪除的結點個數,zong記錄結點個數

26int

q[maxn],tail,father[maxn];

2728 inline int

getint()

2937

38 inline bool bad(int

x)41

42 inline void clear(int x,int

zhi)

4748 inline void insert(int x,int o,int

f)50

if(x>=w[o]) insert(x,son[o][1

],o);

51else insert(x,son[o][0

],o);

52 size[o]++; zong[o]++; if(bad(o)) ret=o;53}

5455 inline void update(int

x)60

61 inline void build(int l,int r,int f,int

fx)//

!!!

68 build(l,mid-1,q[mid],0); build(mid+1,r,q[mid],1

);69

update(q[mid]);70}

7172 inline void mid_dfs(int x)

7778 inline void rebuild(int x)

8283 inline int rank(int x)91}

92return

now;93}

9495 inline int kth(int x)

101}

102}

103104 inline void

out(int x,int o)

108if(x<=p) out(x,son[o][0

]);109

else

out(x-p,son[o][1

]);110

}111

112 inline void

work()

119else

120}

121else

if(ljh==2)

127}

128129

intmain()

130

bzoj 3224,tyvj 1728普通平衡樹

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

BZOJ 3224 Tyvj 1728 普通平衡樹

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

BZOJ3224 Tyvj1728普通平衡樹

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