pb_ds试用

首先就是大名鼎鼎的pdf介绍:
C++的pb_ds库在OI中的应用
看完了之后,再看一下具体实现吧,他没有怎么说具体使用
以下拿 普通平衡树 做了板子,写了一份代码
我用的是 rbtree 和 hashtable
关于这两个东西的说明在代码里有注释的
代码:(168ms,和手写splay几乎相当)

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<ext/pb_ds/assoc_container.hpp> //tree 和 hash_table 的共用头文件
#include<ext/pb_ds/tree_policy.hpp> //tree 头文件
#include<ext/pb_ds/hash_policy.hpp> //hash_table 头文件
#define ll long long
#define max(a,b) a>b?a:b
#define min(a,b) a<b?a:b
using namespace std;
using namespace __gnu_pbds;//最好加上这一句,不然你会写得很累
inline void read(ll &x){
    x=0;int f=1;char ch=' ';
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
    x*=f;
}

typedef tree<ll,null_type,less<ll>,rb_tree_tag,tree_order_statistics_node_update> rbtree;
//这一行是rbtree
//第一个是 key 类型
//第二个就填 null_type
//第三个是比较函数, less 表示从小到大, greater 表示从大到小
//第四个是树的类型,建议使用 rbtree ,跑得最快, splay 是 splay_tree_tag
//第五个是支持 order_of_key 和 find_by_order 的必须

typedef gp_hash_table<ll,int> hashtable;
//这一行是hash_table
//第一个是 key 类型
//第二个是 value 类型
// hash_table 有两个,分别是 cc_hash_table 和 gp_hash_table
//实测 gp_hash_table 更快

rbtree t;
hashtable h;
int main(){
    ll n,opt,x;
    read(n);
    //下面的那一堆 x<<20 是因为数字有重复,要特殊处理
    //大概意思就是把数字再按照插入时间重新分类
    //因为 pb_ds 的 rbtree 不支持重复插入
    //然后 hash_table 就是记录一下出现次数
    //具体细节自己体会吧
    for(int i=1;i<=n;++i){
        read(opt);read(x);
        switch(opt){
            case 1:++h[x];t.insert((x<<20)+h[x]);break;
            case 2:t.erase((x<<20)+h[x]);--h[x];break;
            case 3:printf("%d\n",t.order_of_key(x<<20)+1);break;
            case 4:printf("%d\n",(*t.find_by_order(x-1))>>20);break;
            case 5:printf("%d\n",(*--t.lower_bound(x<<20))>>20);break;
            case 6:printf("%d\n",(*t.upper_bound((x<<20)+n))>>20);break;
        }
    }
    return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值