Sbt 带查找、查询、删除操作

来源:互联网 发布:幼儿园膳食营养软件 编辑:程序博客网 时间:2024/05/15 02:36
#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]);        }    }    int del(int &u, int v) {        if(key[u] == v || ((v < key[u] && c[u][0] == 0) || (v > key[u] && c[u][1] == 0))) {            int k = key[u];            if(c[u][0] == 0 || c[u][1] == 0)                 u = c[u][0] + c[u][1];            else                 key[u] = del(c[u][0], k+1);            return k;        }else {            if(v > key[u])                 return del(c[u][1], v);            else                 return del(c[u][0], v);        }    }    int search(int u, int v) {        if(u == 0 || v == key[u])             return u;        else {            if(v > key[u])                 return search(c[u][1], v);            else                 return search(c[u][0], v);        }    }    int query(int u, int k) {        int s = size[c[u][0]] + 1;        if(k == s)             return key[u];        else {            if(k > s)                 return query(c[u][1], k-s);            else                 return query(c[u][0], k);        }    }    void out(int n) {        if(c[n][0]) out(c[n][0]);        cout << key[n] << ' ';        if(c[n][1]) out(c[n][1]);    }}Sbt;int main() {#ifndef ONLINE_JUDGE     freopen("data.txt", "r", stdin);    freopen("ans.txt", "w", stdout);#endif    int n, m, v, rt = 0;    cin >> n;     Sbt.init();    while(n--) {        cin >> m >> v;        switch(m) {            case 1: Sbt.insert(rt, v); break;            case 2: Sbt.del(rt, v); break;            case 3: Sbt.search(rt, v); break;            case 4: Sbt.query(rt, v); break;            case 5: Sbt.out(rt); break;        }    }    //Sbt.out(rt);    return 0;}
0 0