Description

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

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

Input

第一行为 n ,表示操作的个数,下面 n 行每行有两个数 opt 和 x , opt 表示操作的序号( 1≤opt≤6 )

Output

对于操作 3,4,5,6 每行输出一个数,表示对应答案

Sample Input

10
1 106465
4 1
1 317721
1 460929
1 644985
1 84185
1 89851
6 81968
1 492737
5 493598

Sample Output

106465
84185
492737

Hint

时空限制:1000ms,128M

1.n的数据范围: n≤100000

2.每个数的数据范围: [−107,107][-{10}^7, {10}^7]

来源:Tyvj1728 原名:普通平衡树

在此鸣谢

题解

这里用的是vector

参(xue)考(xi)资料:Rye_Catcher的题解C++ vector用法_金河

因为实在搞不清楚treap的旋转(令人头大  所以选择了万能的STL

其实vector并不是有序的,但是我们可以自行维护vector的有序性。

前置知识:(时间复杂度也不太确定 有问题希望大佬纠正

  • 定义:vector<int>a; 需<vector>头文件
  • 访问元素:a[x]  取出a中的第(x+1)个数(下标从0开始 O(1)
  • a.begin():返回起始元素的迭代器 O(1)
  • a.end():返回终止元素的迭代器 O(1)
  • a.insert(a.begin()+pos,x):在第pos个数后面插入x O(n)
  • a.erase(a.begin()+pos):删除pos位置的数 pos之后的数自动补齐 O(n)
  • lower_bound(a.begin(),a.end(),x)返回第一个==x的位置的迭代器 O(logn)
  • upper_bound(a.begin(),a.end(),x)返回最后一个==x的位置的后面一个的迭代器(x的后继 O(logn)
  • *it:取出迭代器it中的值(大概只有我不知道

然后 你应该自己就懂了(嘿嘿嘿

对着代码理解吧

 #include<algorithm>
#include<iostream>
#include<vector>
using namespace std;
vector<int>a;
int main()
{
int n;
cin>>n;
for(int i=;i<=n;++i)
{
int opt,x;
scanf("%d%d",&opt,&x);
switch(opt)
{
case():a.insert(upper_bound(a.begin(),a.end(),x),x);break;//插入
case():a.erase(lower_bound(a.begin(),a.end(),x));break;//删除
case():cout<<lower_bound(a.begin(),a.end(),x)-a.begin()+<<endl;break;//输出x的排名
case():cout<<a[x-]<<endl;break;//输出第x的数
case():cout<<*--lower_bound(a.begin(),a.end(),x)<<endl;break;//x的前趋
case():cout<<*upper_bound(a.begin(),a.end(),x)<<endl;break;//x的后继
}
}
return ;
}

UPD

新学的set,但是支持的操作肽少了qwq

关于排名的只能用很慢的distance($O(n)$)和advance($O(n)$)qwq

然后还是照着之前那篇题解学的。

嗯。

 /*
qwerta
P3369 【模板】普通平衡树 Unaccepted
64
代码 C++,0.57KB
提交时间 2018-10-31 21:39:58
耗时/内存 5756ms, 2820KB
*/
#include<iostream>
#include<cstdio>
#include<set>
using namespace std;
multiset<int>s;
int main()
{
//freopen("a.in","r",stdin);
int n;
scanf("%d",&n);
while(n--)
{
int opt,x;
scanf("%d%d",&opt,&x);
switch(opt)
{
case():s.insert(x);break;
case():s.erase(s.lower_bound(x));break;
case():cout<<distance(s.begin(),s.lower_bound(x))+<<endl;break;
case():{multiset<int>::iterator it=s.begin();
advance(it,x-);cout<<(*it)<<endl;break;}
case():cout<<(*--s.lower_bound(x))<<endl;break;
case():cout<<(*s.upper_bound(x))<<endl;break;
}
}
return ;
}

「LuoguP3369」 【模板】普通平衡树 (用vector乱搞平衡树的更多相关文章

  1. Note -「计算几何」模板

      尚未完整测试,务必留意模板 bug! /* Clearink */ #include <cmath> #include <queue> #include <cstdi ...

  2. Solution -「LOCAL」模板

    \(\mathcal{Description}\)   OurOJ.   给定一棵 \(n\) 个结点树,\(1\) 为根,每个 \(u\) 结点有容量 \(k_u\).\(m\) 次操作,每次操作 ...

  3. 「BJWC2010」模板严格次小生成树

    题目描述 小 \(C\) 最近学了很多最小生成树的算法,\(Prim\) 算法.\(Kruskal\) 算法.消圈算法等等.正当小\(C\)洋洋得意之时,小\(P\)又来泼小\(C\)冷水了.小\(P ...

  4. 「NOI2004」「LuoguP1486」郁闷的出纳员

    Descrption OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调 ...

  5. 「BZOJ3545」「ONTAK2010」Peaks

    「BZOJ3545」「ONTAK2010」Peaks 题目传送门 题目大意: 给定一个 \(n\) 个点,\(m\) 条边的带点权边权无向图,有 \(q\) 次询问,每次询问从 \(v\) 点出发,经 ...

  6. 「luogu3380」【模板】二逼平衡树(树套树)

    「luogu3380」[模板]二逼平衡树(树套树) 传送门 我写的树套树--线段树套平衡树. 线段树上的每一个节点都是一棵 \(\text{FHQ Treap}\) ,然后我们就可以根据平衡树的基本操 ...

  7. 初涉平衡树「treap」

    treap:一种平衡的二叉搜索树 什么是treap(带旋) treap=tree+heap,这大家都知道.因为二叉搜索树(BST)非常容易被卡成一条链而影响效率,所以我们需要一种更加平衡的树形结构,从 ...

  8. 「luogu3402」【模板】可持久化并查集

    「luogu3402」[模板]可持久化并查集 传送门 我们可以用一个可持久化数组来存每个节点的父亲. 单点信息更新和查询就用主席树多花 一个 \(\log\) 的代价来搞. 然后考虑如何合并两个点. ...

  9. SpringBoot图文教程10—模板导出|百万数据Excel导出|图片导出「easypoi」

    有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1「概念+ ...

随机推荐

  1. ZOJ - 4016 Mergeable Stack (STL 双向链表)

    [传送门]http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4016 [题目大意]初始有n个空栈,现在有如下三种操作: (1) ...

  2. T1079 回家 codevs

    http://codevs.cn/problem/1079/ 时间限制: 1 s  空间限制: 128000 KB  题目等级 : 白银 Silver~死坑 题目描述 Description 现在是晚 ...

  3. profile, bashrc, source, setup.*sh

    一. source: 命令是使该文件立刻执行,这样刚才做的修改就可以立即生效了,否则要重新启动系统修改才能生效.(执行其后命令使之立即生效,不用重启) 二.bashrc: 1.linux系统:/etc ...

  4. mysql PROCEDURE ANALYSE() 用法

    PROCEDURE ANALYSE() 会让 MySQL 帮你去分析你的字段和其实际的数据,并会给你一些有用的建议.只有表中有实际的数据,这些建议才会变得有用,因为要做一些大的决定是需要有数据作为基础 ...

  5. SODBASE CEP学习(四)续:类SQL语言EPL与Storm或jStorm集成-使用分布式缓存

    流式计算在一些情况下会用到分布式缓存,从而实现(1)想把统计或计算结果保存在分布缓存中.供其他模块或其他系统调用. (2)某一滑动时间窗体上计数.比如实时统计1小时每一个Cookie的訪问量.实时统计 ...

  6. 推断dxf文件的版本号

    打开DXF參考手冊,在DXF參考手冊中,点击"索引"-->输入"HEADER",在ACADVER字段有acd的版本号信息: 以下是用C语言,写的推断dxf ...

  7. Android中View自己定义XML属性具体解释以及R.attr与R.styleable的差别

    为View加入自己定义XML属性 Android中的各种Widget都提供了非常多XML属性,我们能够利用这些XML属性在layout文件里为Widget的属性赋值. 例如以下所看到的: <Te ...

  8. PHP内核探索:内存管理开篇

    内存是计算机非常关键的部件之一,是暂时存储程序以及数据的空间,CPU只有有限的寄存器可以用于存储计算数据,而大部分的数据都是存储在内存中的,程序运行都是在内存中进行的.和CPU计算能力一样, 内存也是 ...

  9. mysql中修改表字段名/字段长度/字段类型详解

    在mysql中我们对数据表字段的修改命令只要使用alter就可以了,下面我来给大家详细介绍mysql中修改表字段名/字段长度/字段类型等等一些方法介绍,有需要了解的朋友可参考. 先来看看常用的方法 M ...

  10. Mysql整数运算NULL值处理注意点

    CleverCode近期在导出报表的时候,在整数做减法的时候,发现整数减去null得到是null.这是一个细节问题,希望大家以后注意. 1 表中的数据 total,used都是整形,同意为空. 2 有 ...