平板电视(pb_ds)
作者:互联网
简介
c++中自带了一些非常强大却鲜为人知的功能库—pd_ds库。pb_ds库全称是Policy-Based Data Structures,可见是一些数据结构的集合,主要是Hash表,平衡二叉树、Trie树,优先队列(堆)等。英文官方文档传送门。
平衡二叉树(Balanced Binary Tree)
pb_ds中封装了红黑树(red-black tree)伸展树(splay tree)等。这里主要说一下红黑树主要是我只看了它。
所需头文件
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
emmm,so长对不对,没事,他也有万能头
#include<bits/extc++.h>
然后?然后整个世界都美好了QWQ......但是!!!Dev是不支持这个万能头。根据attack学长的测验,洛谷、HDU、BZOJ、vijos、loj都是支持的,POJ不支持(POJ普通万能头貌似也是不支持的)
定义一颗红黑树
tree<ll,null_type,less<ll>,rb_tree_tag,tree_order_statistics_node_update> T;
//ll是关键字类型,null_type是无映射的意思, less<ll>是从小到大排,rb_tree_tag是输的类型, 最后一部分是更新方式
null_type在老版本c++中需要替换为null_mapped_type(正常情况下是不会用到的)。
最后一部分填写 tree_order_statistics_node_update 可以使用 order_of_key() 和 find_by_order()。
功能
T.insert() //插入操作
T.erase() //删除操作
T.lower_bound()// 返回大于等于 x 最小的迭代器
T.upper_bound()// 返回大于 x 最小的迭代器
T.order_of_key() // 返回严格小于 x 的元素个数。注意,是比 x 小的个数,不是 x 的排名!查询得出的值是排名-1
T.find_by_order() //返回一个迭代器,指向排名为 x 的元素
例题P3369 【模板】普通平衡树
#include<bits/stdc++.h>
#include<cmath>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define reg register
#define ll long long
//#define int long long
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
tree<ll,null_type,less<ll>,rb_tree_tag,tree_order_statistics_node_update> T;//一颗rbt
//ll是关键字类型,null_type是无映射的意思, less<ll>是从小到大排,rb_tree_tag是输的类型, 最后一部分是更新方式
int main()
{
/*因为tree里不能有重复的元素,但插入式肯定会遇到,所以把它左移20位再加一个常数来保证他在不影响相对大小的前提下消除了相同
的数,这样就使得每个数据都不相等,再输出时右移答案20位,这个数不变*/
ios::sync_with_stdio(0);//读入优化
cin.tie(0);cout.tie(0);//再优化
ll n,op,x;ll ans;
cin>>n; /// 输入
for(reg int i=1;i<=n;i++)
{
cin>>op>>x;
if(op==1) T.insert((x<<20)+i);//插入操作
else if(op==2) T.erase(T.lower_bound(x<<20));//删除操作
else if(op==3) cout<<T.order_of_key(x<<20)+1<<"\n";//球排名
else
{
if(op==4) ans=*T.find_by_order(x-1);//找k小值
if(op==5) ans=*--T.lower_bound(x<<20);//返回第一个大于等于k,--就是他的前驱
if(op==6) ans=*T.upper_bound((x<<20)+n);//第一个大于的值,后继
cout<<(ans>>20)<<"\n";//输出
}
}
return 0;
}
别的什么锅以后会补的
标签:ll,tree,order,pb,rb,平板电视,include,ds 来源: https://www.cnblogs.com/Alwaysmaxx/p/16463544.html