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 ...
随机推荐
- 亚马逊AWS学习——VPC里面几个概念的关系
VPC中涉及几个概念: VPC 子网 路由表 Internet网关 安全组 今天来讲讲这几个概念之间的关系. 1. VPC 说的就是VPC,当然VPC范围是最大的,VPC即virtual privat ...
- 自主学习之RxSwift(一) -----Driver
对于RxSwift,我也是初学者,此系列来记录我学习RxSwift的历程! (一) 想必关于Drive大家一定在RxSwift的Demo中看到过,也一定有些不解,抱着一起学习的态度,来了解一下Driv ...
- bzoj千题计划217:bzoj2333: [SCOI2011]棘手的操作
http://www.lydsy.com/JudgeOnline/problem.php?id=2333 读入所有数据,先模拟一遍所有的合并操作 我们不关心联通块长什么样,只关心联通块内有谁 所以可以 ...
- 2017北京国庆刷题Day1 afternoon
期望得分:100+100+100=300 实际得分:100+100+100=300 T1 一道图论好题(graph) Time Limit:1000ms Memory Limit:128MB 题目 ...
- LeetCode & Q122-Best Time to Buy and Sell Stock II-Easy
Description: Say you have an array for which the ith element is the price of a given stock on day i. ...
- 第一次PTA作业
题目6-1拆分实数整数及小数部分 1设计思路 (1) 第一步:阅读题目要求及所给部分. 第二步:根据题意补全相应函数. (2)流程图 无 2.实验代码 #include <stdio.h> ...
- webgoat——XSS
Stage 1: Stored XSS(存储XSS攻击 黑别人) 实验内容:主要是用户"Tom"(攻击者)在自己的个人资料中添加了恶意代码(比如最简单的<script> ...
- GIT入门笔记(10)- 多种撤销修改场景和对策
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file. 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步, ...
- python入门(1)python的前景
python入门(1)python的前景 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. Python由Guido van Rossum于1989年底发明,第一个公开发行版发行于 ...
- 版本名称GA的含义:SNAPSHOT->alpha->beta->release->GA
SNAPSHOT->alpha->beta->release->GA ----------------------------------------------------- ...