普通平衡树Tyvj1728、luogu P3369 (treap)
您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:
插入x数
删除x数(若有多个相同的数,因只删除一个)
查询x数的排名(若有多个相同的数,因输出最小的排名)
查询排名为x的数
求x的前驱(前驱定义为小于x,且最大的数)
- 求x的后继(后继定义为大于x,且最小的数)
--by 洛谷;
http://www.lydsy.com/JudgeOnline/problem.php?id=3224
话说,没时间写题解啊——
不过,也就是个平衡树的模板题;
就存下代码吧
treap哟;
好像很少见写treap的,但常数还是挺小的orz;
哎,最近怎么老写模板啊?
代码如下:
- #include<cstdio>
- #include<cstdlib>
- using namespace std;
- #define INF 2147483647
- int n;
- struct poo
- {
- int size,value,key,cnt;
- int ch[];
- }data[];
- int tot,root,x;
- int make_data(int );
- void insert(int&);
- void roll(int&);
- int find( );
- int rank( );
- void del(int&);
- int las(int );
- int nex(int );
- void up(int );
- int main()
- {
- int i,j;
- data[].value=INF;data[].key=INF;
- scanf("%d",&n);
- for(i=;i<=n;i++){
- scanf("%d%d",&j,&x);
- switch(j){
- case :insert(root);break;
- case : del(root);break;
- case : printf("%d\n",rank( ));break;
- case : printf("%d\n",find( ));break;
- case : printf("%d\n", las(root));break;
- case : printf("%d\n", nex(root));break;
- }
- }
- }
- int make_data(int value)
- {
- tot++;
- data[tot].cnt++;
- data[tot].key=(rand()/+rand()/);
- data[tot].size=;
- data[tot].value=value;
- return tot;
- }
- void insert(int &now)
- {
- if(now==){
- now=make_data(x);
- return;
- }
- if(data[now].value==x){
- data[now].cnt++;
- data[now].size++;
- }
- else{
- int wh=x < data[now].value ? : ;
- insert(data[now].ch[wh]);
- if(data[now].key>=data[data[now].ch[wh]].key)
- roll(now);
- }
- up(now);
- }
- void roll(int &now)
- {
- int wh=data[data[now].ch[]].key<data[data[now].ch[]].key?:;
- int son=data[now].ch[wh];
- data[now].ch[wh]=data[son].ch[wh^];
- data[son].ch[wh^]=now;
- up(now);
- now=son;
- }
- int find()
- {
- int now=root;
- int ls,rs;
- ls=data[now].ch[];rs=data[now].ch[];
- while(x<=data[ls].size||x>data[now].size-data[rs].size){
- if(data[ls].size>=x)
- now=ls;
- else{
- x=x+data[rs].size-data[now].size;
- now=rs;
- }
- ls=data[now].ch[];rs=data[now].ch[];
- }
- return data[now].value;
- }
- int rank()
- {
- int now=root,ans=;
- int ls=data[now].ch[],rs=data[now].ch[];
- while(x!=data[now].value&&x!=)
- {
- if(x<data[now].value)
- now=ls;
- else{
- ans+=data[now].size-data[rs].size;
- now=rs;
- }
- ls=data[now].ch[];rs=data[now].ch[];
- }
- return ans+data[ls].size+;
- }
- void del(int &now)
- {
- if(data[now].value==x){
- if(data[now].cnt==){
- if(data[now].ch[]*data[now].ch[]==){
- now=data[now].ch[]+data[now].ch[];
- return ;
- }
- roll(now);
- int wh=data[data[now].ch[]].value==x?:;
- del(data[now].ch[wh]);
- }
- else{
- data[now].size--; data[now].cnt--;
- }
- }
- else{
- int wh=data[now].value>x?:;
- del(data[now].ch[wh]);
- }
- up(now);
- }
- int las(int now)
- {
- int ans=,an=;
- if(!now)return ;
- if(data[now].value<x){
- ans=data[now].value;
- an=las(data[now].ch[]);
- ans=an!=?an:ans;
- }
- else{
- ans=las(data[now].ch[]);
- }
- return ans;
- }
- int nex(int now)
- {
- int ans=,an=;
- if(!now)return ;
- if(data[now].value>x){
- ans=data[now].value;
- an=nex(data[now].ch[]);
- ans=an!=?an:ans;
- }
- else{
- ans=nex(data[now].ch[]);
- }
- return ans;
- }
- void up(int now)
- {
- data[now].size=data[data[now].ch[]].size+data[data[now].ch[]].size+data[now].cnt;
- }
- //treap on the 2017.1.21
- //10
- //1 5
- //4 1
- //1 6
- //1 7
- //1 10
- //1 3
- //1 4
- //6 2
- //1 8
- //5 9
- //
- //14
- //1 5
- //1 6
- //1 7
- //1 10
- //1 3
- //1 4
- //1 8
- //3 3
- //3 4
- //3 5
- //3 6
- //4 5
- //4 6
- //4 7
祝AC哟;
普通平衡树Tyvj1728、luogu P3369 (treap)的更多相关文章
- [luogu P3369]【模板】普通平衡树(Treap/SBT)
[luogu P3369][模板]普通平衡树(Treap/SBT) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删 ...
- 数组splay ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) #include <cstdio> #define Max 100005 #define Inline _ ...
- 替罪羊树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) 闲的没事,把各种平衡树都写写 比较比较... 下面是替罪羊树 #include <cstdio> #inc ...
- 红黑树 ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) 近几天闲来无事...就把各种平衡树都写了一下... 下面是红黑树(Red Black Tree) 喜闻乐见拿到了luo ...
- 【数据结构】平衡树splay和fhq—treap
1.BST二叉搜索树 顾名思义,它是一棵二叉树. 它满足一个性质:每一个节点的权值大于它的左儿子,小于它的右儿子. 当然不只上面那两种树的结构. 那么根据性质,可以得到该节点左子树里的所有值都比它小, ...
- 【luogu P3369 普通平衡树(Treap/SBT)】 模板 Splay
题目链接:https://www.luogu.org/problemnew/show/P3369 #include <cstdio> #include <algorithm> ...
- fhq treap ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
二次联通门 : LibreOJ #104. 普通平衡树 #include <cstdio> #include <iostream> #include <algorithm ...
- 普通平衡树Tyvj1728、luogu P3369 (splay)
存个模板,这次是splay的: 题目见这个题解: <--(鼠标移到这儿) 代码如下: #include<cstdio> #define INF 2147483647 using na ...
- 【luogu P3369 【模板】普通平衡树(Treap/SBT)】 模板 Scapegoat Tree
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> ...
随机推荐
- 利用python 学习数据分析 (学习一)
内容学习自: Python for Data Analysis, 2nd Edition 就是这本 纯英文学的很累,对不对取决于百度翻译了 前情提要: 各种方法贴: https://w ...
- java四行代码实现图片下载
如下: InputStream in = new URL("http://www.updown/thumbnail.jpg).openStream(); Path temp = Paths. ...
- 【算法笔记】A1039 Course List for Student
https://pintia.cn/problem-sets/994805342720868352/problems/994805447855292416 题意: 有N个学生,K节课.给出选择每门课的 ...
- 升级vue-cli为 cli3 并创建项目
一.升级npm install -g @vue/cli 二.创建项目 1.vue create vue3-project 下面会提示让你配置下自己想要用到的功能,然后它会自动帮你安装,这个看自己需求 ...
- scrapyd的安装
.安装 pip3 install scrapyd 二.配置 安装完毕之后,需要新建一个配置文件/etc/scrapyd/scrapyd.conf,Scrapyd在运行的时候会读取此配置文件. 在Scr ...
- 【GIS新探索】GeoHash原理和编解码实现
1.什么是GeoHash geohash基本原理是将地球理解为一个二维平面,将平面递归分解成更小的子块,每个子块在一定经纬度范围内拥有相同的编码.不好理解,没关系,我来找个图. 就像上面这张图,一个坐 ...
- ftpClient.retrieveFileStream导致FTPClient的后面操作失败
问题代码: FTPFile[] fs = ftpClient.listFiles(); for (FTPFile ff : fs) { if (ff.getName().equals(fileName ...
- 关于微信企业号操作api的sdk封装 (.net)
做微信的第三方开发业半年多了 现在献上微信企业号的操作sdk(包括源码) 本人水平有限 望大家多提意见 下载地址献上:下载
- C#集合通论
前言 写这篇文章的最初动力是来自于一次笔试经历.有一道笔试题大概是这样的:程序使用一个txt文件来存储操作记录.存储记录是多行字符串,每一行代表一次操作记录,格式如下:用户名+操作事项名称+操作时间. ...
- 计算2..n的素数
def check(2) , do: true def check(n) when n >2 do b = for x <- (Enum.into 2..n-1,[]),do: x if ...