当前位置: 首页 > news >正文

LOJ104 普通平衡树

题目描述

这是一道模板题。

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

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

输入格式

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

输出格式

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

样例

样例输入

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

样例输出

106465
84185
492737

数据范围与提示

 1<=n<=10 5,-10 7<=x<=10 7
 ___________________________________________________________________________
 
fhq_treap模板
___________________________________________________________________________
  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 const int maxn=1e5+10;
  4 struct node
  5 {
  6     int val,lc,rc,siz,rd;
  7 }tr[maxn];
  8 int cnt,root,n;
  9 int newnode(int v)
 10 {
 11     ++cnt;
 12     tr[cnt].val=v;
 13     tr[cnt].siz=1;
 14     tr[cnt].rd=rand();
 15     tr[cnt].lc=tr[cnt].rc=0;
 16     return cnt;
 17 }
 18 void update(int cur)
 19 {
 20     tr[cur].siz=tr[tr[cur].lc].siz+tr[tr[cur].rc].siz+1;
 21 }
 22 int merge(int x,int y)
 23 {
 24     if(x*y==0)return x+y;
 25     if(tr[x].rd<tr[y].rd)
 26     {
 27         tr[x].rc=merge(tr[x].rc,y);
 28         update(x);
 29         return x;
 30     }
 31     else
 32     {
 33         tr[y].lc=merge(x,tr[y].lc);
 34         update(y);
 35         return y;
 36     }
 37 }
 38 void split(int cur,int v,int &x,int &y)
 39 {
 40     if(!cur)x=y=0;
 41     else
 42     {
 43         if(tr[tr[cur].lc].siz+1<=v)
 44         {
 45             x=cur;
 46             split(tr[cur].rc,v-tr[tr[cur].lc].siz-1,tr[cur].rc,y);
 47             update(cur);
 48         }
 49         else
 50         {
 51             y=cur;
 52             split(tr[cur].lc,v,x,tr[cur].lc);
 53             update(cur);
 54         }
 55     }
 56 }
 57 void splitv(int cur,int v,int &x,int &y)
 58 {
 59     if(!cur)x=y=0;
 60     else
 61     {
 62         if(tr[cur].val<=v)
 63         {
 64             x=cur;
 65             splitv(tr[cur].rc,v,tr[cur].rc,y);
 66             update(cur);
 67         }
 68         else
 69         {
 70             y=cur;
 71             splitv(tr[cur].lc,v,x,tr[cur].lc);
 72             update(cur);
 73         }
 74     }
 75 }
 76 void insert(int v)
 77 {
 78     int x,y;
 79     splitv(root,v,x,y);
 80     root=merge(merge(x,newnode(v)),y);
 81 }
 82 void del(int v)
 83 {
 84     int x,y,z;
 85     splitv(root,v,x,z);
 86     splitv(x,v-1,x,y);
 87     y=merge(tr[y].lc,tr[y].rc);
 88     root=merge(merge(x,y),z);
 89 }
 90 void find(int v)
 91 {
 92     int x,y;
 93     splitv(root, v-1,x,y);
 94     printf("%d\n",tr[x].siz+1);
 95     root=merge(x,y);
 96 }
 97 void kth(int now,int v)
 98 {
 99     int cur=now;
100     if(v>tr[now].siz || v<1)return ;
101     while(cur)
102     {
103         if(tr[tr[cur].lc].siz+1==v)
104         {
105             printf("%d\n",tr[cur].val);
106             return ;
107         }
108         else if(tr[tr[cur].lc].siz >= v)cur=tr[cur].lc;
109         else
110         {
111             v-=tr[tr[cur].lc].siz+1;
112             cur=tr[cur].rc;
113         }
114     }
115 }
116 void pre(int v)
117 {
118     int x,y,z;
119     splitv(root,v-1,x,y);
120     kth(x,tr[x].siz);
121     root=merge(x,y);
122 }
123 void next(int v)
124 {
125     int x,y,z;
126     splitv(root,v,x,y);
127     kth(y,1);
128     root=merge(x,y);
129 }
130 int main()
131 {
132     scanf("%d",&n);
133     for(int op,x,i=0;i<n;++i)
134     {
135         scanf("%d%d",&op,&x);
136         if(op==1)insert(x);
137         else if(op==2)del(x);
138         else if(op==3)find(x);
139         else if(op==4)kth(root,x);
140         else if(op==5)pre(x);
141         else next(x);
142     }
143     return 0;
144 }
View Code

 

转载于:https://www.cnblogs.com/gryzy/p/10684015.html

相关文章:

  • Airport Simulation (数据结构与算法 – 队列 / Queue 的应用)
  • 掌握 Dojo 工具包
  • js中用变量作为$()内id的值、动态获取id,及获取其下面的class元素
  • 读Google三大论文后感
  • 数据展现DataList控件(26)
  • [转帖] 使用 InstallShield 安装和卸载SQL Server 数据库
  • Spring Cloud微服务如何设计异常处理机制?
  • SpringCloud 之 Bus消息总线
  • 26步打造高访问量网站[经典]
  • Silverlight 4中把DataGrid数据导出Excel—附源码下载
  • 类加载、反射
  • Ubuntu 中的编程语言(上)
  • 17.Merge Two Binary Trees(合并两个二叉树)
  • 03与08组策略区别
  • [Pytorch] pytorch笔记 三
  • angular学习第一篇-----环境搭建
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • Fundebug计费标准解释:事件数是如何定义的?
  • HTTP中GET与POST的区别 99%的错误认识
  • javascript 哈希表
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • JS字符串转数字方法总结
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • Python连接Oracle
  • React的组件模式
  • Spark RDD学习: aggregate函数
  • Vue2 SSR 的优化之旅
  • 程序员该如何有效的找工作?
  • 创建一个Struts2项目maven 方式
  • 当SetTimeout遇到了字符串
  • 关于使用markdown的方法(引自CSDN教程)
  • 欢迎参加第二届中国游戏开发者大会
  • 前端代码风格自动化系列(二)之Commitlint
  • 前端之React实战:创建跨平台的项目架构
  • 双管齐下,VMware的容器新战略
  • 延迟脚本的方式
  • 译有关态射的一切
  • 运行时添加log4j2的appender
  • 自制字幕遮挡器
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • # 数据结构
  • #1015 : KMP算法
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • (33)STM32——485实验笔记
  • (zt)最盛行的警世狂言(爆笑)
  • (搬运以学习)flask 上下文的实现
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (强烈推荐)移动端音视频从零到上手(上)
  • (转)setTimeout 和 setInterval 的区别
  • (转)为C# Windows服务添加安装程序
  • ***原理与防范
  • ../depcomp: line 571: exec: g++: not found