1 splay
1 void rotate(int o, int kind) { 2 int p = pre[o]; 3 ch[p][!kind] = ch[o][kind], pre[ch[o][kind]] = p; 4 ch[pre[p]][ch[pre[p]][1] == p] = o, pre[o] = pre[p]; 5 ch[o][kind] = p, pre[p] = o; 6 } 7 void splay(int o, int goal) { 8 while (pre[o] != goal) { 9 if (pre[pre[o]] == goal) rotate(o, ch[pre[o]][0] == o); 10 else { 11 int p = pre[o], kind = ch[pre[p]][0] == p; 12 if (ch[p][kind] == o) rotate(o, !kind), rotate(o, kind); 13 else rotate(p, kind), rotate(o, kind); 14 } 15 } 16 if (goal == 0) root = o; 17 }
2 Treap
1 void rotate(int &o, int kind) { 2 int x = ch[o][!kind]; 3 ch[o][!kind] = ch[x][kind]; 4 ch[x][kind] = o; 5 o = x; 6 }
3 fhq_Treap
1 void split(int o, int keyy, int &x, int &y) { 2 if (!o) x = y = 0; 3 else { 4 if (key[o] <= keyy) x = o, split(ch[o][1], keyy, ch[o][1], y); 5 else y = o, split(ch[o][0], keyy, x, ch[o][0]); 6 } 7 } 8 int merge(int x, int y) { 9 if (!x || !y) return x+y; 10 if (lev[x] < lev[y]) { 11 ch[x][1] = merge(ch[x][1], y); 12 return x; 13 }else { 14 ch[y][0] = merge(x, ch[y][0]); 15 return y; 16 } 17 }
4 LCT
1 void rotate(int o, int kind) { 2 int p = pre[o]; 3 ch[p][!kind] = ch[o][kind], pre[ch[o][kind]] = p; 4 if (isrt[p]) isrt[o] = 1, isrt[p] = 0; 5 else ch[pre[p]][ch[pre[p]][1] == p] = o; 6 pre[o] = pre[p]; 7 ch[o][kind] = p, pre[p] = o; 8 } 9 void splay(int o) { 10 push(o); 11 while (!isrt[o]) { 12 if (isrt[pre[o]]) rotate(o, ch[pre[o]][0] == o); 13 else { 14 int p = pre[o], kind = ch[pre[p]][0] == p; 15 if (ch[p][kind] == o) rotate(o, !kind), rotate(o, kind); 16 else rotate(p, kind), rotate(o, kind); 17 } 18 } 19 } 20 void access(int o) { 21 int y = 0; 22 while (o) { 23 splay(o); 24 isrt[ch[o][1]] = 1, isrt[ch[o][1] = y] = 0; 25 o = pre[y = o]; 26 } 27 } 28 void makeroot(int o) { 29 access(o), splay(o); 30 rev[o] ^= 1, swap(ch[o][0], ch[o][1]); 31 } 32 void link(int x, int y) { 33 makeroot(x); pre[x] = y; 34 } 35 void cut(int x, int y) { 36 makeroot(x), access(y), splay(y); 37 ch[y][0] = pre[x] = 0, isrt[x] = 1; 38 }
5 左偏树
1 int merge(int a, int b) { 2 if (!a || !b) return a+b; 3 if (key[a] > key[b]) swap(a, b); 4 ch[a][1] = merge(ch[a][1], b); 5 if (dist[ch[a][0]] < dist[ch[a][1]]) swap(ch[a][0], ch[a][1]); 6 dist[a] = dist[ch[a][1]]+1; 7 return a; 8 }