bzoj3224Tyvj 1728 普通平衡树 treap
3224: Tyvj 1728 普通平衡树
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 17706 Solved: 7764
[Submit][Status][Discuss]
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
1.n的数据范围:n<=100000
2.每个数的数据范围:[-2e9,2e9]
Source
题目上没说,但是此题是权值小的排在前面。。因为这个我调了1h
treap操作
求前驱后继的时候注意开全局变量而不是函数return,因为函数return 不好写
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define ll long long
#define N 100050
using namespace std;
int n,rt,cnt,ans;struct node{int l,r,w,siz,val,rd;}t[N];
void update(int u){t[u].siz=t[t[u].l].siz+t[t[u].r].siz+t[u].w;}
void lturn(int &u){
int tmp=t[u].r;t[u].r=t[tmp].l;t[tmp].l=u;
t[tmp].siz=t[u].siz;update(u);u=tmp;
}
void rturn(int &u){
int tmp=t[u].l;t[u].l=t[tmp].r;t[tmp].r=u;
t[tmp].siz=t[u].siz;update(u);u=tmp;
}
void insert(int &u,int v){
if(!u){
u=++cnt;t[u].w=t[u].siz=1;
t[u].rd=rand();t[u].val=v;
return;
}
t[u].siz++;
if(v==t[u].val){
t[u].w++;
return;
}
if(v>t[u].val){
insert(t[u].r,v);
if(t[u].rd>t[t[u].r].rd)lturn(u);
}
else{
insert(t[u].l,v);
if(t[u].rd>t[t[u].l].rd)rturn(u);
}
}
void del(int &u,int x){
if(!u)return;
if(t[u].val==x){
if(t[u].w>1){
t[u].w--;t[u].siz--;
return;
}
if(t[u].l*t[u].r==0)u=t[u].l+t[u].r;
else if(t[t[u].l].rd<t[t[u].r].rd)rturn(u),del(u,x);
else lturn(u),del(u,x);
}
else if(x>t[u].val)t[u].siz--,del(t[u].r,x);
else t[u].siz--,del(t[u].l,x);
}
int getrank(int u,int v){
if(t[u].val==v)return t[t[u].l].siz+1;
if(t[u].val>v)return getrank(t[u].l,v);
return t[t[u].l].siz+t[u].w+getrank(t[u].r,v);
}
int getval(int u,int x){
int ls=t[t[u].l].siz;ls=max(ls,0);
if(x>ls&&x<=ls+t[u].w)return t[u].val;
if(x<=ls)return getval(t[u].l,x);
return getval(t[u].r,x-ls-t[u].w);
}
void getpre(int u,int x){
if(!u)return;
if(t[u].val<x){
ans=u;
getpre(t[u].r,x);
}
else getpre(t[u].l,x);
}
void getsuf(int u,int x){
if(!u)return;
if(t[u].val>x){
ans=u;
getsuf(t[u].l,x);
}
else getsuf(t[u].r,x);
}
/*
debug
void dfs(int u){
if(!u)return;
printf("%d %d %d %d\n",u,t[u].l,t[u].r,t[u].val);
dfs(t[u].l);
dfs(t[u].r);
}
*/
int main(){
scanf("%d",&n);
int op,x;int m=0;
while(n--){
//debug printf("line:%d \n",++m);
scanf("%d%d",&op,&x);
if(op==1)insert(rt,x);
if(op==2)del(rt,x);
if(op==3)printf("%d\n",getrank(rt,x));
if(op==4)printf("%d\n",getval(rt,x));
if(op==5)ans=0,getpre(rt,x),printf("%d\n",t[ans].val);
if(op==6)ans=0,getsuf(rt,x),printf("%d\n",t[ans].val);
}
return 0;
}
bzoj3224Tyvj 1728 普通平衡树 treap的更多相关文章
- BZOJ 3224 TYVJ 1728 普通平衡树 [Treap树模板]
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 7390 Solved: 3122 [Submit][S ...
- BZOJ 3224: Tyvj 1728 普通平衡树 treap
3224: Tyvj 1728 普通平衡树 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除 ...
- [BZOJ3224] [Tyvj 1728] 普通平衡树 (treap)
Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1. 插入x数 2. 删除x数(若有多个相同的数,因只删除一个) 3. 查询x数的排名(若有多个相 ...
- BZOJ - 3224 Tyvj 1728 普通平衡树 (treap/树状数组)
题目链接 treap及树状数组模板题. treap版: #include<bits/stdc++.h> using namespace std; typedef long long ll; ...
- [BZOJ3224]Tyvj 1728 普通平衡树
[BZOJ3224]Tyvj 1728 普通平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个) ...
- [普通平衡树treap]【学习笔记】
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 9046 Solved: 3840[Submit][Sta ...
- BZOJ 3224: Tyvj 1728 普通平衡树
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 9629 Solved: 4091[Submit][Sta ...
- bzoj3224 Tyvj 1728 普通平衡树(名次树+处理相同)
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 5354 Solved: 2196[Submit][Sta ...
- BZOJ 3224: Tyvj 1728 普通平衡树(BST)
treap,算是模板题了...我中间还一次交错题... -------------------------------------------------------------------- #in ...
随机推荐
- 第四十六条:for-each循环优先于传统的for循环
for(Elements e : list) { //doSomeThing-- }
- Scala Option类型
转载自: Scala 初学者指南, 这里有一系列很棒的文章 类型 Option 可能你已经见过它在 Map API 中的使用:在实现自己的提取器时,我们也用过它, 然而,它还需要更多的解释. 你可能会 ...
- ebtables和iptables与linux bridge的交互
本文为翻译文,不一定是逐字逐句的翻译,而且中间会加上自己的一点见解,如有理解错误的地方,还请大家指出,我定虚心学习.原文见链接 其中斜体字是自己的理解,建议和ebtables手册和iptables手册 ...
- 新手入门 git
Git是目前世界上最先进的分布式版本控制系统 特点:高端大气上档次 什么是版本控制系统 系统自动记录文件改动 方便同事协作管理 不用自己管理一堆类似的文件了,也不需要把文件传来传去.如果想查看某次改动 ...
- WebApi 方法的参数类型总结。
1:[HttpGet] ①:get方法之无参数. [HttpGet] public IHttpActionResult GetStudentInfor() { List<StudentMode ...
- Python内置函数(20)——hex
英文文档: hex(x) Convert an integer number to a lowercase hexadecimal string prefixed with "0x" ...
- h5图片上传预览
项目中常用到文件上传预览功能,整理一下:如果不想使用 type="file" 的默认样式,可以让其覆盖在一个按钮样式上边,设其透明度为0,或者使用Label关联 html < ...
- 阿里云API网关(5)用户指南(调用 API)
网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...
- Python之socketserver模块和验证客户端链接的合法性
验证客户端链接的合法性 分布式系统中实现一个简单的客户端链接认证功能 #_*_coding:utf-8_*_ from socket import * import hmac,os secret_ke ...
- 集合之深入理解HashMap
Hashmap是一种非常常用的.应用广泛的数据类型 1.hashmap的数据结构 要知道hashmap是什么,首先要搞清楚它的数据结构,在java编程语言中,最基本的结构就是两种,一个是数组,另外一个 ...