luogu p3369
题目描述
您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:
插入x数
删除x数(若有多个相同的数,因只删除一个)
查询x数的排名(排名定义为比当前数小的数的个数+1。若有多个相同的数,因输出最小的排名)
查询排名为x的数
求x的前驱(前驱定义为小于x,且最大的数)
求x的后继(后继定义为大于x,且最小的数)
输入输出格式
输入格式:
第一行为n,表示操作的个数,下面n行每行有两个数opt和x,opt表示操作的序号( 1≤opt≤6 )
输出格式:
对于操作3,4,5,6每行输出一个数,表示对应答案
输入输出样例
输入样例#1:
10
1 106465
4 1
1 317721
1 460929
1 644985
1 84185
1 89851
6 81968
1 492737
5 493598
输出样例#1:
106465
84185
492737
说明
时空限制:1000ms,128M
1.n的数据范围: n≤100000
2.每个数的数据范围: [-{10}^7, {10}^7]
--------------------------------------------------------------------------------------
刚学的,不用旋转的TREAP
好写,主要就是split和merge两个操作。
可以实现可持久化。
可以实现区间操作。
据说,比splay要慢
--------------------------------------------------------------------------------------
- 1 #include<bits/stdc++.h>
- 2 using namespace std;
- 3 const int maxn=1e5+5;
- 4 const int inf=1e9;
- 5 struct node
- 6 {
- 7 int ch[2],val,rd,siz;
- 8 }tr[maxn];
- 9 int n,m,l,r;
- 10 int tot,root;
- 11 int newnode(int v)
- 12 {
- 13 ++tot;
- 14 tr[tot].val=v;
- 15 tr[tot].rd=rand();
- 16 tr[tot].siz=1;
- 17 tr[tot].ch[0]=tr[tot].ch[1]=0;
- 18 return tot;
- 19 }
- 20 void update(int x)
- 21 {
- 22 tr[x].siz=tr[tr[x].ch[0]].siz+tr[tr[x].ch[1]].siz+1;
- 23 }
- 24 int merge(int a,int b)
- 25 {
- 26 if(a*b==0)return a+b;
- 27 if(tr[a].rd<tr[b].rd)
- 28 {
- 29 tr[a].ch[1]=merge(tr[a].ch[1],b);
- 30 update(a);
- 31 return a;
- 32 }
- 33 else
- 34 {
- 35 tr[b].ch[0]=merge(a,tr[b].ch[0]);
- 36 update(b);
- 37 return b;
- 38 }
- 39 }
- 40 void split(int cur,int k,int &x,int &y)
- 41 {
- 42 if(!cur)x=y=0;
- 43 else
- 44 {
- 45 if(tr[cur].val<=k)
- 46 {
- 47 x=cur;
- 48 split(tr[cur].ch[1],k,tr[cur].ch[1],y);
- 49 }
- 50 else
- 51 {
- 52 y=cur;
- 53 split(tr[cur].ch[0],k,x,tr[cur].ch[0]);
- 54 }
- 55 update(cur);
- 56 }
- 57 }
- 58 void insert(int v)
- 59 {
- 60 int x,y;
- 61 split(root,v,x,y);
- 62 root=merge(merge(x,newnode(v)),y);
- 63 }
- 64 void del(int v)
- 65 {
- 66 int x,y,z;
- 67 split(root,v,x,z);
- 68 split(x,v-1,x,y);
- 69 y=merge(tr[y].ch[0],tr[y].ch[1]);
- 70 root=merge(merge(x,y),z);
- 71 }
- 72 void findrank(int v)
- 73 {
- 74 int x,y;
- 75 split(root,v-1,x,y);
- 76 printf("%d\n",tr[x].siz+1);
- 77 root=merge(x,y);
- 78 }
- 79 int kth(int now,int k)
- 80 {
- 81 int cur=now;
- 82 while(cur)
- 83 {
- 84 if(tr[tr[cur].ch[0]].siz+1==k)return tr[cur].val;
- 85 else if(tr[tr[cur].ch[0]].siz>=k)cur=tr[cur].ch[0];
- 86 else
- 87 {
- 88 k-=tr[tr[cur].ch[0]].siz+1;
- 89 cur=tr[cur].ch[1];
- 90 }
- 91 }
- 92 return -inf;
- 93 }
- 94 void pre(int v)
- 95 {
- 96 int x,y;
- 97 split(root,v-1,x,y);
- 98 printf("%d\n",kth(x,tr[x].siz));
- 99 root=merge(x,y);
- 100 }
- 101 void suc(int v)
- 102 {
- 103 int x,y;
- 104 split(root,v,x,y);
- 105 printf("%d\n",kth(y,1));
- 106 root=merge(x,y);
- 107 }
- 108 int main()
- 109 {
- 110 srand((unsigned)time(NULL));
- 111 int n,op,v;
- 112 scanf("%d",&n);
- 113 while(n--)
- 114 {
- 115 scanf("%d%d",&op,&v);
- 116 switch(op)
- 117 {
- 118 case 1:insert(v);break;
- 119 case 2:del(v);break;
- 120 case 3:findrank(v);break;
- 121 case 4:printf("%d\n",kth(root,v));break;
- 122 case 5:pre(v);break;
- 123 case 6:suc(v);break;
- 124 default:break;
- 125 }
- 126 }
- 127 return 0;
- 128 }
luogu p3369的更多相关文章
- [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 ...
- 【luogu P3369 普通平衡树(Treap/SBT)】 模板 Splay
题目链接:https://www.luogu.org/problemnew/show/P3369 #include <cstdio> #include <algorithm> ...
- luogu P3369 【模板】普通平衡树(splay)
嘟嘟嘟 突然觉得splay挺有意思,唯一不足的是这几天是一天一道,debug到崩溃. 做了几道平衡树基础题后,对这题有莫名的自信,还算愉快的敲完了代码后,发现样例都过不去,然后就陷入了无限的debug ...
- 普通平衡树Tyvj1728、luogu P3369 (splay)
存个模板,这次是splay的: 题目见这个题解: <--(鼠标移到这儿) 代码如下: #include<cstdio> #define INF 2147483647 using na ...
- 普通平衡树Tyvj1728、luogu P3369 (treap)
您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询x数的排名(若有多个相同的数,因输出最小的排名) 查询排名为x的 ...
- 【luogu P3369 【模板】普通平衡树(Treap/SBT)】 模板 Scapegoat Tree
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> ...
- 【luogu P3369 【模板】普通平衡树(Treap/SBT)】 题解 pb_ds
我永远都爱STL ! 我爱PB_DS ! #include <iostream> #include <cstdio> #include <ext/pb_ds/tree_p ...
随机推荐
- 【mysql】- Expalin篇
简介 id:在一个大的查询语句中每个 SELECT 关键字都对应一个唯一的id 与查询优化器有关,假如被优化过,那么可能是上下两个的id都是一样的 select_type:SELECT 关键字对应的那 ...
- Python错误重试方法
前言 Tenacity是一个 Apache 2.0授权的通用重试库,用 Python 编写,用于简化向几乎所有内容添加重试行为的任务.它起源于一个重新尝试的分支,可惜这个分支已经不复存在了. 使用Te ...
- Azure Service Bus(三)在 .NET Core Web 应用程序发送ServiceBus Queue
一,引言 在之前上一篇讲解到 Azure ServiceBus Queue 中,我们实地的演示了在控制台中如何操作ServiceBus Queue ,使用 Azure.Messgae.Service ...
- druid监控
1 @ConfigurationProperties(prefix = "spring.datasource") 2 @Bean 3 public DataSource druid ...
- RocketMQ 简介
本文根据阿里云 RocketMQ产品文档整理 地址:https://help.aliyun.com/document_detail/29532.html?userCode=qtldtin2 简介 Ro ...
- CTF常见编码及加解密(超全)
@ 目录 前言 常见CTF编码及加解密 补充 ASCII编码 base家族编码 MD5.SHA1.HMAC.NTLM等类似加密型 1.MD5 2.SHA1 3.HMAC 4.NTLM 5.类似加密穷举 ...
- 【SpringBoot1.x】SpringBoot1.x 消息
SpringBoot1.x 消息 文章源码 概述 大多应用中,可通过消息服务中间件来提升系统异步通信.扩展解耦能力. 消息服务有两个重要概念,即消息代理(message broker)和目的地(des ...
- 通过写n本书的积累,我似乎找到了写好技术文章的方法(回复送我写的python股票电子书)
我写的书不算少,写的博文就更多了,但大多数书的销量也就一般,而我写的技术文章里,虽然也有点击过万的,但不少点击量也就只有三位数. 通过不断反思,也通过对比了一些畅销书和顶流文章,我似乎找到了一些原因, ...
- 剑指offer-查找数组中重复的数字
找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重 ...
- 深入汇编指令理解Java关键字volatile
volatile是什么 volatile关键字是Java提供的一种轻量级同步机制.它能够保证可见性和有序性,但是不能保证原子性 可见性 对于volatile的可见性,先看看这段代码的执行 flag默认 ...