STL真是个好东西。

最近在看pb_ds库及vector和set的用法,就想用这三种操作来实现一下普通平衡树,结果pb_ds中的rbtree不支持重复值,而本蒟蒻也看不懂不懂各大佬用pb_ds的实现,况且应该有人已经贴上了题解。我就发一发vector和set(其实是multiset)的题解吧。(只不过蒟蒻的我我根本不会打splay)

代码都很短,操作其实也很基础。


vector版:

  • 你要知道:

    • lower_bound(first,last,x)在first和last中的前闭后开区间进行查找,其中如果寻找的x存在,那么lower_bound返回一个迭代器指向其中第一个x元素。

      时间复杂度:O(logN)

    • upper_bound(first,last,x)在first和last中的前闭后开区间进行查找,返回一个迭代器指向最后一个x元素的下一个位置(就是说返回在保持顺序的情况下,可插入x的最后一个位置或者说就是返回x的后继)

      时间复杂度:O(logN)

    • vector.insert(pos,x)在pos处插入一个x

      vector.erase(pos,x)在删除pos处的x

      时间复杂度:这个不太清楚,貌似是O(N)

    然后你就能看懂下面的代码了

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cctype>
using namespace std;
vector <int>a;
int read()
{
int x=0;char ch;short int neg=0;ch=getchar();
while(!isdigit(ch)){
neg|=(ch=='-');ch=getchar();
}
while(isdigit(ch)){
x=x*10+ch-48;ch=getchar();
}
return neg?-x:x;
}
int main()
{
int n,op;
cin>>n;
while(n--)
{
cin>>op;
register int x=read();
switch(op){
case(1):a.insert(upper_bound(a.begin(),a.end(),x),x);break;
case(2):a.erase(lower_bound(a.begin(),a.end(),x));break;
case(3): cout<<lower_bound(a.begin(),a.end(),x)-a.begin()+1<<endl;break;
case(4): cout<<a[x-1]<<endl;break;
case(5): cout<<*--lower_bound(a.begin(),a.end(),x)<<endl;break;
case(6): cout<<*upper_bound(a.begin(),a.end(),x)<<endl;break;
}
}
return 0;
}

可以看出,我们是有序地加入元素,vector本身也是有序的

开O2跑得比香港记者还快,不开O2好像最慢的300多ms


set版:

C++ STL中的set好像是用红黑树实现的,但是它并不支持重复元素,所以我们只能用multiset,然而用multiset(其实set也是)搞排名之类的就好复杂了......看网上说好像是STL中的红黑树并没有维护什么size域,我也不太懂。

  • 你要知道:

    • insert和erase和上面基本一样的

    • distance(pos1,pos2)返回一个int值为pos1与pos2之间的距离,pos1,pos2为指向同一容器的迭代器。

      时间复杂度:O(N)

    • advance(pos,k)一个void的函数,让pos这个迭代器前进k步

      时间复杂度:O(N)

    • set.equal_range(x),它返回的一队迭代器,因此是pair类型,定义时需注意。

      具体用法详见这: http://blog.csdn.net/zhongguoren666/article/details/8463249

      时间复杂度:O(logN)

    由于上面操作的时间复杂度以及常数较大,用set开O2依旧会T掉几个点,我这个代码在O2优化时还会玄学WA了一个,我也不清楚为什么,不知道有没有dalao搞一个更优的set做法

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <set>
#include <cctype>
using namespace std;
multiset <int>a;
int read()
{
int x=0;char ch;short int neg=0;ch=getchar();
while(!isdigit(ch)){
neg|=(ch=='-');ch=getchar();
}
while(isdigit(ch)){
x=x*10+ch-48;ch=getchar();
}
return neg?-x:x;
}
int main()
{
int n,op;
cin>>n;
while(n--)
{
cin>>op;
register int x=read();
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)cout<<distance(a.begin(),a.upper_bound(x))<<endl;
else if(op==4)
{multiset<int>::iterator it =a.begin();
//int k=distance(a.begin(),a+x);
advance(it,x-1); cout<<' '<<*it<<endl;}
else if(op==5) cout<<*--lower_bound(a.begin(),a.end(),x)<<endl;
else { pair<multiset<int>::const_iterator,multiset<int>::const_iterator> it;
it=a.equal_range(x);cout<<*it.second<<endl;}//cout<<*upper_bound(a.begin(),a.end(),x)<<endl;
}
return 0;
}

当然,STL不会支持更多变式操作况且现在裸题也越来越少,但它用来优化某些东西或是对拍还是非常有用的。

本蒟蒻也要开始学splay了

题解 P3369 【【模板】普通平衡树(Treap/SBT)】的更多相关文章

  1. luoguP3369[模板]普通平衡树(Treap/SBT) 题解

    链接一下题目:luoguP3369[模板]普通平衡树(Treap/SBT) 平衡树解析 #include<iostream> #include<cstdlib> #includ ...

  2. 【模板】平衡树——Treap和Splay

    二叉搜索树($BST$):一棵带权二叉树,满足左子树的权值均小于根节点的权值,右子树的权值均大于根节点的权值.且左右子树也分别是二叉搜索树.(如下) $BST$的作用:维护一个有序数列,支持插入$x$ ...

  3. [luogu P3369]【模板】普通平衡树(Treap/SBT)

    [luogu P3369][模板]普通平衡树(Treap/SBT) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删 ...

  4. 洛谷P3369 【模板】普通平衡树(Treap/SBT)

    洛谷P3369 [模板]普通平衡树(Treap/SBT) 平衡树,一种其妙的数据结构 题目传送门 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除 ...

  5. 数组splay ------ luogu P3369 【模板】普通平衡树(Treap/SBT)

    二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) #include <cstdio> #define Max 100005 #define Inline _ ...

  6. 替罪羊树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)

    二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) 闲的没事,把各种平衡树都写写 比较比较... 下面是替罪羊树 #include <cstdio> #inc ...

  7. 红黑树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)

    二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) 近几天闲来无事...就把各种平衡树都写了一下... 下面是红黑树(Red Black Tree) 喜闻乐见拿到了luo ...

  8. AC日记——【模板】普通平衡树(Treap/SBT) 洛谷 P3369

    [模板]普通平衡树(Treap/SBT) 思路: 劳资敲了一个多星期: 劳资终于a了: 劳资一直不a是因为一个小错误: 劳资最后看的模板: 劳资现在很愤怒: 劳资不想谈思路!!! 来,上代码: #in ...

  9. P3369 【模板】普通平衡树 Treap

    P3369 [模板]普通平衡树(Treap/SBT) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询 ...

  10. 算法模板——平衡树Treap 2

    实现功能:同平衡树Treap 1(BZOJ3224 / tyvj1728) 这次的模板有了不少的改进,显然更加美观了,几乎每个部分都有了不少简化,尤其是删除部分,这个参照了hzwer神犇的写法,在此鸣 ...

随机推荐

  1. shell命令:getevent和sendevent

    1.getevent 输出所有event设备的基本信息 输出格式: 设备名: 事件type 事件code 事件value 注意:这里的数字都是16进制. getevent -c 10 //输出10条信 ...

  2. 官网引用的axios,lodash文件在脚手架中如何使用?

    对于官网属性与侦听器模块,所引用的以下文件在脚手架中如何使用? <script src="https://cdn.jsdelivr.net/npm/axios@0.12.0/dist/ ...

  3. js 删除 按钮所在的行

    <body> <table id="delte"> <caption>简易购物车</caption> <tr> < ...

  4. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_15-页面静态化-模板管理-模板管理业务流程

    在视频教学的过程中,不会去做模板管理的模块 cms_template用来存储模板信息 cms_page 这一些课程页面用的是一个模板 模板的详情.templateFileId是模板的文件id 模板的文 ...

  5. Navicat连接MySQL 8出现2059 - authentication plugin 'caching_sha2_password'的解决办法

    进入MySQL控制台,执行如下命令: use mysql; ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY ...

  6. JS遍历数组,实现数组去重(重复的元素只保留一个)

    1.遍历数组法 它是最简单的数组去重方法(indexOf方法) 实现思路:新建一个数组,遍历去要重的数组,当值不在新数组的时候(indexOf为-1)就加入该新数组中: var arr=[2,8,5, ...

  7. 【amad】cookiecutter -- 一个命令行工具,使用项目模版来构建项目

    动机 简介 个人评分 动机 一般的框架都有脚手架工具,但是并不会让所有人满意. 简介 cookiecutter1是一个Python实现的命令行工具,可以通过项目模版来构建项目. 它的特性包括: 跨平台 ...

  8. IDEA debug漏洞第一篇(weblogic,cve-2017-10271)

    在weblogic.wsee.jaxws.WLSServletAdapter的129行打点 if (var2.getMethod().equals("GET") || var2.g ...

  9. 【FFMPEG】【ARM-Linux开发】fmpeg安装第三方编码器(encoder)库,ffmpeg编码h264(完)

    fmpeg安装第三方编码器(encoder)库,ffmpeg编码h264(完) ffmpeg安装第三方编码器(encoder)库 关键词:ffmpeg.编码h264.第三方encoder 安装好了ff ...

  10. vue-cli3创建vue项目之vue.config.js配置

    module.exports = { // 基本路径 publicPath: '/', // 输出文件目录 outputDir: 'dist', // eslint-loader 是否在保存的时候检查 ...