今天集训讲平衡树,就瞎搞了一下。直接下代码。
#include<iostream> #include<cstdio> #include<cmath> #include<ctime> #include<cstdlib> using namespace std; int cnt; //现在的点总数 int lc[100010],rc[100010]; //左右儿子 int sz[100010]; //子树大小 int V[100010]; //当前点的权值 int R[100010];//为随机的值,为了保证堆的性质 void update(int cur) //子树大小 { sz[cur] = sz[lc[cur]] + sz[rc[cur]] + 1; } void right_rotate(int &q) { int p = lc[q]; lc[q] = rc[p]; rc[p] = q; update(q); update(p); q = p; } void left_rotate(int &q) { int p = rc[q]; rc[q] = lc[p]; lc[p] = q; update(q); update(p); q = p; } void insert(int &cur,int v) //cur为当前节点,v为插入的值 { if(!cur) { cur = ++ cnt; V[cnt] = v; R[cnt] = rand(); return; } if(v < V[cur]) { insert(lc[cur],v); update(cur); if(R[lc[cur]] < R[cur]) { right_rotate(cur); } } else { insert(rc[cur],v); update(cur); if(R[rc[cur]] < R[cur]) { left_rotate(cur); } } } void del(int &cur,int v) { if(!cur) return; if(V[cur] == v) { if(lc[cur] && rc[cur]) { left_rotate(cur); del(lc[cur],v); } else { cur = lc[cur] | rc[cur]; update(cur); return; } } else if(V[cur] > v) { del(lc[cur],v); } else del(rc[cur],v); update(cur); } int main() { return 0; }