博客园 首页 私信博主 显示目录 隐藏目录 管理

【模板】假的平衡树

有很多方法维护以下要求的数...
Here

而我,很不要脸的用vector水了过去!...(捂脸)
维护一些数,其中需要提供以下操作:
1 插入x数
2 删除x数(若有多个相同的数,因只删除一个)
3 查询x数的排名(排名定义为比当前数小的数的个数+1。若有多个相同的数,因输出最小的排名)
4 查询排名为x的数
5 求x的前驱(前驱定义为小于x,且最大的数)
6 求x的后继(后继定义为大于x,且最小的数)

#include<bits/stdc++.h>

using namespace std;

int n;
vector<int> A;

template <typename T>
T read(){
    T N(0), F(1);
    char C = getchar();
    for(; !isdigit(C); C = getchar()) if(C == '-') F = -1;
    for(; isdigit(C); C = getchar()) N = N*10 + C-48;
    return N*F;
}

int main(){
    n = read<int>();
    while(n--){
        int op = read<int>();
        int x = read<int>();

        if(op == 1) A.insert(upper_bound(A.begin(), A.end(), x), x);
        else if(op == 2) A.erase(lower_bound(A.begin(), A.end(), x));
        else if(op == 3) printf("%d\n", lower_bound(A.begin(), A.end(), x) - A.begin() + 1);
        else if(op == 4) printf("%d\n", A[x-1]);
        else if(op == 5){
            int pos = lower_bound(A.begin(), A.end(), x)-A.begin();
            printf("%d\n", A[--pos]);
        }
        else{
            int pos = upper_bound(A.begin(), A.end(), x)-A.begin();
            printf("%d\n",A[pos]);
        }
    }
    
    return 0;
}
posted @ 2017-10-18 08:57  Hanser  阅读(130)  评论(0编辑  收藏  举报