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 ...
随机推荐
- Hibernate之缓存
Hibernate为了解决频繁查询数据的效率问题,提供了三种级别的缓存 1.一级缓存 一级缓存 又叫 session缓存 .Session对象会缓存处于持久化状态的每个对象 ,如果下次想用数据表中同一 ...
- 2017 清北济南考前刷题Day 4 afternoon
期望得分:30+50+30=110 实际得分:40+0+0=40 并查集合并再次写炸... 模拟更相减损术的过程 更相减损术,差一定比被减数小,当被减数=减数时,停止 对于同一个减数来说,会被减 第1 ...
- 爬虫小探-Python3 urllib.request获取页面数据
使用Python3 urllib.request中的Requests()和urlopen()方法获取页面源码,并用re正则进行正则匹配查找需要的数据. #forex.py#coding:utf-8 ' ...
- Web Api 使用模型验证
public class Person { public int Id { get; set; } [Required(ErrorMessage = "姓名不能为空啊啊啊!")] ...
- Ansible自动化运维工具-上
[Ansible特点] 1)Ansible与saltstack均是基于Python语言开发的 2)安装使用简单,基于不同插件和模块实现各种软件,平台,版本的管理以及支持虚拟容器多层级的部署 3)不需要 ...
- python random 模块的用法
Python中的random模块用于生成随机数.下面介绍一下random模块中最常用的几个函数. random.random random.random()用于生成一个0到1的随机符点数: 0 < ...
- Mego开发文档 - 保存关系数据
保存关系数据 由于没有对象的更改跟踪,因此关系的操作需要开发者明确指定,在成功执行后Mego会影响到相应的关系属性中. 添加关系 在以下示例中如果成功执行则source的Customer属性会变为ta ...
- vuex在项目中使用的一点总结
以下为vue后台管理项目中使用vuex的一点总结,截取了其中部分代码,如有什么错误,还望指出. 1. token 存储 登陆成功之后,需要把获取到的 token 存储到 vuex 中,配合 axios ...
- Oracle复合B*tree索引branch block内是否包含非先导列键值?
好久不碰数据库底层细节的东西,前几天,一个小家伙跑来找我,非要说复合b*tree index branch block中只包含先导列键值信息,并不包含非先导列键值信息,而且还dump了branch b ...
- 【Vue中的swiper轮播组件】
<template> <swiper :options="swiperOption" ref="mySwiper"> <!-- s ...