您的位置:首页 > 其它

Size Balanced Tree Sbt模板

2016-07-31 17:20 344 查看
#include<bits/stdc++.h>
using namespace std;
const int maxn = 200000 + 10;

struct SBT {
int cnt;
int c[maxn][2], key[maxn], size[maxn];
void init() {
cnt = 0;
memset(c, 0, sizeof(c));
memset(size, 0, sizeof(size));
}
void Push_up(int u) { size[u] = size[c[u][0]] + size[c[u][1]] + 1; }
//left -> 1, right -> 0
void rotate(int &u, bool t) {
int k = c[u][t];
c[u][t] = c[k][!t];
c[k][!t] = u;
size[k] = size[u];
Push_up(u), u = k;
}
void maintain(int &u, bool t) {
if(!t) {
if(size[c[u][1]] < size[c[c[u][0]][0]])
rotate(u, 0);
else {
if(size[c[u][1]] < size[c[c[u][0]][1]]) {
rotate(c[u][0], 1);
rotate(u, 0);
}else return;
}
}else {
if(size[c[u][0]] < size[c[c[u][1]][1]])
rotate(u, 1);
else {
if(size[c[u][0]] < size[c[c[u][1]][0]]) {
rotate(c[u][1], 0);
rotate(u, 1);
}else return;
}
}
maintain(c[u][0], false);
maintain(c[u][1], true);
maintain(u, false);
maintain(u, true);
}
void insert(int &u, int v) {
if(!u) {
key[u = ++cnt] = v; size[u] = 1;
}else {
size[u]++;
if(v >= key[u])
insert(c[u][1], v);
else
insert(c[u][0], v);
maintain(u, v >= key[u]);
}
}
void out(int n) {
if(c
[0]) out(c
[0]);
cout << key
<< ' ';
if(c
[1]) out(c
[1]);
}
}Sbt;

int main() {
#ifndef ONLINE_JUDGE
freopen("data.txt", "r", stdin);
freopen("ans.txt", "w", stdout);
#endif
int n, rt = 0;
cin >> n;
Sbt.init();
for(int i=0; i<n; i++) {
int v;
cin >> v;
Sbt.insert(rt, v);
}
Sbt.out(rt);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Sbt 平衡树