然而我還是在繼續刷水題。。。
終於解開了區間第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...