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的更多相关文章

  1. BZOJ 3224 TYVJ 1728 普通平衡树 [Treap树模板]

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 7390  Solved: 3122 [Submit][S ...

  2. BZOJ 3224: Tyvj 1728 普通平衡树 treap

    3224: Tyvj 1728 普通平衡树 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除 ...

  3. [BZOJ3224] [Tyvj 1728] 普通平衡树 (treap)

    Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1. 插入x数 2. 删除x数(若有多个相同的数,因只删除一个) 3. 查询x数的排名(若有多个相 ...

  4. BZOJ - 3224 Tyvj 1728 普通平衡树 (treap/树状数组)

    题目链接 treap及树状数组模板题. treap版: #include<bits/stdc++.h> using namespace std; typedef long long ll; ...

  5. [BZOJ3224]Tyvj 1728 普通平衡树

    [BZOJ3224]Tyvj 1728 普通平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个) ...

  6. [普通平衡树treap]【学习笔记】

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 9046  Solved: 3840[Submit][Sta ...

  7. BZOJ 3224: Tyvj 1728 普通平衡树

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 9629  Solved: 4091[Submit][Sta ...

  8. bzoj3224 Tyvj 1728 普通平衡树(名次树+处理相同)

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 5354  Solved: 2196[Submit][Sta ...

  9. BZOJ 3224: Tyvj 1728 普通平衡树(BST)

    treap,算是模板题了...我中间还一次交错题... -------------------------------------------------------------------- #in ...

随机推荐

  1. bzoj 4399 魔法少女LJJ

    4399: 魔法少女LJJ Time Limit: 20 Sec  Memory Limit: 162 MBhttp://www.lydsy.com/JudgeOnline/problem.php?i ...

  2. .Net EntityFramwork6.0 EF框架开发入门

    一.环境 开发环境:Sqlserver2008 R2.Visual Studio2012   二.准备工作 1.新建MVC空项目 2.通过NuGet获取 EntityFramework 包  操作截图 ...

  3. maven 每次update后影响接口实现类的问题

    遇到maven每次update后,就会更改eclipse中java Compiler中的jdk compliance版本 <plugin> <groupId>org.apach ...

  4. 阿里云API网关(12)为员工创建子账号,实现分权管理API:使用RAM管理API

    网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...

  5. spring-oauth-server实践:使用授权方式四:client_credentials 模式的客户端和服务端交互

    spring-oauth-server入门(1-11)使用授权方式四:client_credentials 模式的客戶端 一.客户端逻辑 1.界面入口(credentials_access_token ...

  6. keepalive配置支持ipv6、ipv4双棧支持

    因公司业务需要,keepalived需要同时支持ipv6和ipv4 keepalived版本1.2.23. keepalived 配置: 重点:ipv6的虚IP配置在 virtual_ipaddres ...

  7. setInterval()使用时易疏忽的点

    举个例子: 一道题目 这两个程序的区别就在于我向setInterval的参数一function写入了参数.这就是导致运行结果不尽如人意的原因. setInterval()方法可以接收三个参数,此参数会 ...

  8. React-Native(三):React Native是基于React设计的

    React Native是基于React js设计的. 参考:<React 入门实例教程> React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript ...

  9. POJ-1287 Networking---裸的不能再裸的MST

    题目链接: https://vjudge.net/problem/POJ-1287 题目大意: 模板 #include<iostream> #include<cstdio> # ...

  10. 04、NetCore2.0下Web应用之Startup源码解析

    04.NetCore2.0Web应用之Startup源码解析   通过分析Asp.Net Core 2.0的Startup部分源码,来理解插件框架的运行机制,以及掌握Startup注册的最优姿势. - ...