一般是使用
const double alp = 1 - sqrt(2) / 2;
const double delp = alp / (1 - alp);
但是使用
const double alp = 0.2;
const double delp = 0.207583625;
会快一点
merge 如下:
int merge(int u, int v) {
if(!u || !v) return u | v;
if(sz[u] >= sz[v] * delp && sz[v] >= sz[u] * delp) {
return up(u, v);
}
if(sz[u] >= sz[v]) {
down(u);
int l = ls[u], r = rs[u];
if(sz[l] >= alp * (sz[u] + sz[v])) return merge(l, merge(r, v));
down(r);
return merge(merge(l, ls[r]), merge(rs[r], v));
}
else {
down(v);
int l = ls[v], r = rs[v];
if(sz[r] >= alp * (sz[u] + sz[v])) return merge(merge(u, l), r);
down(l);
return merge(merge(u, ls[l]), merge(rs[l], r));
}
}