其他分享
首页 > 其他分享> > 平板电视(pb_ds)

平板电视(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