「LuoguP3369」 模板普通平衡树 (用vector乱搞平衡树

Posted qwerta

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了「LuoguP3369」 模板普通平衡树 (用vector乱搞平衡树相关的知识,希望对你有一定的参考价值。

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中的值(大概只有我不知道

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

对着代码理解吧

 1 #include<algorithm>
 2 #include<iostream>
 3 #include<vector>
 4 using namespace std;
 5 vector<int>a;
 6 int main()
 7 {
 8     int n;
 9     cin>>n;
10     for(int i=1;i<=n;++i)
11     {
12         int opt,x;
13         scanf("%d%d",&opt,&x);
14         switch(opt)
15         {
16             case(1):a.insert(upper_bound(a.begin(),a.end(),x),x);break;//插入
17             case(2):a.erase(lower_bound(a.begin(),a.end(),x));break;//删除
18             case(3):cout<<lower_bound(a.begin(),a.end(),x)-a.begin()+1<<endl;break;//输出x的排名
19             case(4):cout<<a[x-1]<<endl;break;//输出第x的数
20             case(5):cout<<*--lower_bound(a.begin(),a.end(),x)<<endl;break;//x的前趋
21             case(6):cout<<*upper_bound(a.begin(),a.end(),x)<<endl;break;//x的后继
22         }
23     }
24     return 0;
25 }

 

以上是关于「LuoguP3369」 模板普通平衡树 (用vector乱搞平衡树的主要内容,如果未能解决你的问题,请参考以下文章

P3369 模板普通平衡树(Treap/SBT)

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

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

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

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

luogu P3369 普通平衡树