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