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 #include4using
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的後繼 後...