題目鏈結
平衡樹系列最後一題
坑啊10s時間限制跑了9764ms。。。還是要學一學bit套主席樹啦。。。
經典的線段樹套treap。。。至於第一發為什麼要tle(我不會告訴你treap插入的時候忘了旋轉 woc)
自認為treap寫的挺好看的(歡迎來噴)
1 #include2 #include3 #include4 #include5 #include6 #include7 #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,且最小的數 額,這個題,看了一眼就知道是...