bzoj3224 Tyvj 1728 普通平衡樹

2021-07-30 13:54:39 字數 2480 閱讀 9445

description

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

1. 插入x數

2. 刪除x數(若有多個相同的數,因只刪除乙個)

3. 查詢x數的排名(若有多個相同的數,因輸出最小的排名)

4. 查詢排名為x的數

5. 求x的前驅(前驅定義為小於x,且最大的數)

6. 求x的後繼(後繼定義為大於x,且最小的數)

input

第一行為n,表示操作的個數,下面n行每行有兩個數opt和x,opt表示操作的序號(1<=opt<=6)

output

對於操作3,4,5,6每行輸出乙個數,表示對應答案

sample input

10 1 106465

4 1

1 317721

1 460929

1 644985

1 84185

1 89851

6 81968

1 492737

5 493598

sample output

106465

84185

492737

**(splay)

#include

#include

#include

#include

#include

int c[1000005][2],fa[1000005],size[1000005],num[2000005];

int cnt,n,rt,ans;

inline

int read()

while (ch>='0'&&ch<='9')

return x*f;

}inline

void update(int x)

using

namespace

std;

void rotate(int x,int &k)

void splay(int x,int &k)

rotate(x,k);

}}void insert(int &k,int x,int f)

if (x>=num[k]) insert(c[k][1],x,k);else insert(c[k][0],x,k);

}void find(int k,int x)

if (num[k]>x) find(c[k][0],x);else find(c[k][1],x);

}void query_before(int k,int x)

else query_before(c[k][0],x);

}void query_after(int k,int x)

else query_after(c[k][1],x);

}void cl(int &x)

void del(int x)

int query_rank(int x)

int query_num(int k,int x)

int main()

if (opt==6)

}return

0;}

**(treap)

#include#include#include#include#include#define n 1000005

int n,cnt,rt,ans;

intsize[n],sum[n],rnd[n],num[n],ls[n],rs[n];

inline int read()

while (ch>='0'&&ch<='9')

return x*f;

}inline void update(int k)

inline void lturn(int &k)

inline void rturn(int &k)

using namespace std;

void insert(int &k,int x)

size[k]++;

if (num[k]==x)sum[k]++;

else

if (x>num[k])

if (rs[k]*ls[k]==0) k=rs[k]+ls[k];

else

if (rnd[ls[k]]else lturn(k),del(k,x);

}else

if (x>num[k])

size[k]--,del(rs[k],x);

else

size[k]--,del(ls[k],x);

}int query_rank(int k,int x)

int query_num(int k,int x)

void query_pro(int k,int x)

void query_sub(int k,int x)

int main()

}return

0;}

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.題目題...