bzoj3196 二逼平衡樹

2022-05-11 06:50:11 字數 3008 閱讀 8088

題目鏈結

平衡樹系列最後一題

坑啊10s時間限制跑了9764ms。。。還是要學一學bit套主席樹啦。。。

經典的線段樹套treap。。。至於第一發為什麼要tle(我不會告訴你treap插入的時候忘了旋轉 woc)

自認為treap寫的挺好看的(歡迎來噴)

1 #include2 #include3 #include4 #include5 #include6 #include

7 #include8 #include9 #include10 #include11 #include12 #include

13#define rre(i,r,l) for(int i=(r);i>=(l);i--)

14#define re(i,l,r) for(int i=(l);i<=(r);i++)

15#define clear(a,b) memset(a,b,sizeof(a))

16#define inout(x) printf("%d",(x))

17#define douin(x) scanf("%lf",&x)

18#define strin(x) scanf("%s",(x))

19#define llin(x) scanf("%lld",&x)

20#define op operator

21#define csc main

22 typedef unsigned long

long

ull;

23 typedef const

intcint;

24 typedef long

long

ll;25

using

namespace

std;

26 cint inf=100000000;27

void inin(int &ret)

2831

while(ch>='

0'&&ch<='

9')ret*=10,ret+=ch-'

0',ch=getchar();

32 ret=f?-ret:ret;33}

34int ch[2000050][2],c[2000050],s[2000050],rr[2000050],w[2000020

],ed;

35struct

segtree

3639

void maintain(int k)

40void rotate(int &k,int

d)41

47private:48

void add(int &k,const

int &x)

49s[k]++;

55if(x==w[k])

56int d=x>w[k];add(ch[k][d],x);

57if(rr[ch[k][d]]1

);58}59

bool del(int &k,const

int &x)

6065

if(!ch[k][0])

66if(!ch[k][1])

67if(rr[ch[k][0]]1]])rotate(k,1

);68

else rotate(k,0

);69

return

del(k,x);70}

71int d=x>w[k];

72if

(del(ch[k][d],x))

7377

else

return0;

78}79int findrank(int k,const

int &x)

8087

int findwei(int k,const

int &x)

8896

void findqian(int k,const

int &x,int &ans)

97102

void findhou(int k,const

int &x,int &ans)

103108

public

:109

void add(int

x)110

void del(int

x)111

int findrank(int x)

112int findwei(int x)

113int findqian(int

x)114

118int findhou(int

x)119

123 }t[200020

];124

int qi[50050

];125

void build(int k,int l,int r,int

x)126

132int findrank(int k,int l,int r,int

x)133

140int findqian(int k,int l,int r,int

x)141

148int findhou(int k,int l,int r,int

x)149

156int findwei(int l,int r,int

x)157

165return findqian(1,l,r,ans+1

);166

}167

void change(int k,int x,int

w)168

175int

n,m;

176int

csc()

177192

else

if(opt==2

)193

197else

if(opt==3

)198

202else

if(opt==4

)203

207else

208213

}214

return0;

215 }

Bzoj3196 二逼平衡樹

您需要寫一種資料結構 可參考題目標題 來維護乙個有序數列,其中需要提供以下操作 1.查詢k在區間內的排名 2.查詢區間內排名為k的值 3.修改某一位值上的數值 4.查詢k在區間內的前驅 前驅定義為小於x,且最大的數 5.查詢k在區間內的後繼 後繼定義為大於x,且最小的數 額,這個題,看了一眼就知道是...

BZOJ3196 二逼平衡樹

因為線段樹支援區間修改查詢,平衡樹支援查詢第k大,乙個數的排名,乙個數的前驅 後繼。所以選擇兩個資料結構套在一起。include include include using namespace std int n,m,sz,tmp int a 200005 root 200005 struct tr...

Bzoj3196 二逼平衡樹

您需要寫一種資料結構 可參考題目標題 來維護乙個有序數列,其中需要提供以下操作 1.查詢k在區間內的排名 2.查詢區間內排名為k的值 3.修改某一位值上的數值 4.查詢k在區間內的前驅 前驅定義為小於x,且最大的數 5.查詢k在區間內的後繼 後繼定義為大於x,且最小的數 額,這個題,看了一眼就知道是...