用vector实现普通平衡树 By cellur925

其实我真的很想学习手写平衡树的==。但是感觉联赛前真没有时间了(太菜了。),于是先学一个STL代用苟,如果还能继续在\(tsoi\)苟,回来一定先学平衡树=w=。

然后因为窝对STL用的不是特别好,有的地方说的可能不太准确..还请各位dalao斧正\(qwq\)

维护信息:

您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:

  1. 插入x数
  2. 删除x数(若有多个相同的数,因只删除一个)
  3. 查询x数的排名(若有多个相同的数,因输出最小的排名)
  4. 查询排名为x的数
  5. 求x的前驱(前驱定义为小于x,且最大的数)
  6. 求x的后继(后继定义为大于x,且最小的数)

vector的几个新鲜操作

平时一般用的都是\(pushback\)\(empty\)\(clear\),下标随机访问等通俗操作,今天介绍一些新的。

\(insert\):这东西不仅在\(set\)中有,\(vector\)其实也是有的,而且非常资瓷,能在指定位置插入制定元素,一般用法是\(v.insert\)(位置,元素)。这里的位置用的是迭代器,也就是说用
\(lowerbound\)类似的操作时不用减去\(v\).\(begin()\)

\(erase\):删除制定位置的数,位置也是迭代器。
一般用法:\(v.erase\)(位置)。

星号解除引用:与\(set\)操作类似。

#include<cstdio>
#include<algorithm>
#include<vector>

using namespace std;

int n;
vector<int>v;

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        int op=0,x=0;
        scanf("%d%d",&op,&x);
        if(op==1) v.insert(upper_bound(v.begin(),v.end(),x),x);
        else if(op==2) v.erase(lower_bound(v.begin(),v.end(),x));
        else if(op==3) printf("%d\n",lower_bound(v.begin(),v.end(),x)-v.begin()+1);
        else if(op==4) printf("%d\n",v[x-1]);
        else if(op==5) printf("%d\n",*--lower_bound(v.begin(),v.end(),x));
        else if(op==6) printf("%d\n",*upper_bound(v.begin(),v.end(),x));
    }
    return 0;
}

不过这玩意NOIP不到真正要用的时候千万别用 毕竟要是越界的就凉凉了!!

转载于:https://www.cnblogs.com/nopartyfoucaodong/p/9872660.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值