bzoj 3196 樹套樹模板

2022-04-30 09:03:07 字數 2779 閱讀 3580

然而我還是在繼續刷水題。。。

終於解開了區間第k大的心結。。。

比較裸的線段樹套平衡樹,比較不好想的是求區間第k大時需要二分一下答案,然後問題就轉化為了第乙個操作。複雜度nlog3n。跑的比較慢。。。

在查前驅後繼的時候寫錯了。。。如果要直接賦值ans的話前驅是k[x]<=z,後繼是k[x]

1 #include2 #include3 #include4 #include5

#define lc x*2,l,mid

6#define rc x*2+1,mid+1,r

7#define ls(x) ch[x][0]

8#define rs(x) ch[x][1]

9#define inf 0x3f3f3f3f

10using

namespace

std;

11int

n,m;

12int root[50005*50

];13

int size[50005*50],k[50005*50

];14

int ch[50005*50][2],fa[50005*50

];15

int a[50005

];16

intcnt;

17 inline void push_up(int

x)18

22 inline void rotate(int

p)23

32push_up(q);push_up(p);33}

34 inline void splay(int now,int

x)3543}

44 root[now]=x;45}

46 inline void insert(int now,int x,int

z)47

52 inline void build(int x,int l,int

r)53

60 inline int fd(int x,int

z)61

69else ans+=size[ch[x][0]]+1,x=ch[x][1

];70}71

return

ans;72}

73 inline int qur(int x,int l,int r,int ll,int rr,int

kk)74

79int mid=(l+r)>>1;80

int ans=0;81

if(ll<=mid)ans+=qur(lc,ll,rr,kk);

82if(rr>mid)ans+=qur(rc,ll,rr,kk);

83return

ans;84}

85 inline int find(int x,int

z)86

92return0;

93}94 inline void del(int now,int

x)95

105}

106 inline void gai(int x,int l,int r,int pos,int

z)107

116 inline int pre(int x,int

z)117

if(k[x]<=z)ans=max(ans,k[x]);

124return

ans;

125}

126 inline int suc(int x,int

z)127

if(k[x]>=z)ans=min(ans,k[x]);

134return

ans;

135}

136 inline int qur_pre(int x,int l,int r,int ll,int rr,int

kk)137

142int ans=-inf;

143int mid=(l+r)>>1

;144

if(ll<=mid)ans=max(ans,qur_pre(lc,ll,rr,kk));

145if(rr>mid)ans=max(ans,qur_pre(rc,ll,rr,kk));

146return

ans;

147}

148 inline int qur_suc(int x,int l,int r,int ll,int rr,int

kk)149

154int ans=inf;

155int mid=(l+r)>>1

;156

if(ll<=mid)ans=min(ans,qur_suc(lc,ll,rr,kk));

157if(rr>mid)ans=min(ans,qur_suc(rc,ll,rr,kk));

158return

ans;

159}

160int

mn,mx;

161int

main()

162168 build(1,1

,n);

169for(int i=1;i<=m;i++)

170179

else

if(t1==2

)180

189 printf("

%d\n

",ha);

190}

191else

if(t1==3

)192

196else

if(t1==4

)197

201else

202206

}207

return0;

208 }

線段樹套平衡樹 BZOJ3196

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

BZOJ 3196 二逼平衡樹 樹套樹

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

BZOJ3196二逼平衡樹 樹套樹

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