3224: Tyvj 1728 普通平衡树

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 7390  Solved: 3122
[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.每个数的数据范围:[-1e7,1e7]
数据如下http://pan.baidu.com/s/1jHMJwO2
 
 
 
 
treap的模板题,涉及了treap的各种操作
操作函数中运用了传引用的方式改变上一层结点的子节点值,很方便
 
 /*by SilverN*/
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
struct treap{
int l,r;//左右子树
int val,ct;//值 重复次数
int size,rand;//管控数量,随机权值
}t[];
int root=,cnt=;
int ans;
void update(int k){
t[k].size=t[t[k].l].size+t[t[k].r].size+t[k].ct;
}
void lt(int &k){//左旋
int now=t[k].r;
t[k].r=t[now].l;
t[now].l=k;
t[now].size=t[k].size;
update(k);
k=now;
return;
}
void rt(int &k){
int now=t[k].l;
t[k].l=t[now].r;
t[now].r=k;
t[now].size=t[k].size;
update(k);
k=now;
return;
}
void insert(int &k,int x){//&k是为了建新节点 x为插入值
if(k==){//建新节点
t[++cnt].val=x;
t[cnt].size=;
t[cnt].ct=;
t[cnt].rand=rand();
k=cnt;
return;
}
t[k].size++;
if(t[k].val==x) t[k].ct++;//与节点等值
else if(x>t[k].val){
insert(t[k].r,x);
if(t[t[k].r].rand<t[k].rand) lt(k);
}else{//x<t[k].val
insert(t[k].l,x);
if(t[t[k].l].rand<t[k].rand) rt(k);
}
return;
}
void del(int &k,int x){
if(k==)return;
if(t[k].val==x){
if(t[k].ct>){t[k].ct--;t[k].size--;return;}
if(t[k].l*t[k].r==)k=t[k].l+t[k].r;//如果k是链结点(只有一个子节点),由其子节点补位
else{
if(t[t[k].l].rand<t[t[k].r].rand){
rt(k);
del(k,x);
}
else{
lt(k);
del(k,x);
}
}
return; }
t[k].size--;
if(x>t[k].val)del(t[k].r,x);
if(x<t[k].val)del(t[k].l,x);
return;
}
void ask_p(int k,int x,int mode){//前驱 //mode==1 ->前驱 mode==2 ->后驱
if(mode==){
if(!k)return;
if(t[k].val<x){//依照二叉树的性质,要找小的往左查,要找大的往右查
ans=t[k].val;
ask_p(t[k].r,x,);
}else ask_p(t[k].l,x,);
return;
}
if(mode==){
if(!k)return;
if(t[k].val>x){
ans=t[k].val;
ask_p(t[k].l,x,);
}else ask_p(t[k].r,x,);
}
return;
}
int ask_rank(int k,int x){//已知数字问排名
if(!k)return ;
if(t[k].val==x)return t[t[k].l].size+;
if(t[k].val<x)return t[k].ct+t[t[k].l].size+ask_rank(t[k].r,x);
else return ask_rank(t[k].l,x);
}
int ask_num(int k,int x){// 已知排名问数字
if(!k)return ;
if(x<=t[t[k].l].size)return ask_num(t[k].l,x);//排名小于左子树包含结点数量,则往左查
if(x>t[t[k].l].size+t[k].ct)return ask_num(t[k].r,x-t[t[k].l].size-t[k].ct);
//排名大于“左子树结点数加父结点重复数”,则往右查
else return t[k].val;//否则返回父结点值
}
int main(){
int opt,x;
scanf("%d",&n);
while(n--){
scanf("%d%d",&opt,&x);
switch(opt){
case : insert(root,x); break;
case : del(root,x); break;
case : printf("%d\n",ask_rank(root,x)); break;
case : printf("%d\n",ask_num(root,x)); break;
case : ask_p(root,x,);printf("%d\n",ans);break;//前驱
case : ask_p(root,x,);printf("%d\n",ans);break;//前驱
}
// for(int i=1;i<=cnt;i++)printf("%d ",t[i].val);
// cout<<endl;
}
return ;
}

BZOJ 3224 TYVJ 1728 普通平衡树 [Treap树模板]的更多相关文章

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

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

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

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

  3. bzoj 3224: Tyvj 1728 普通平衡树 替罪羊树

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

  4. BZOJ 3224: Tyvj 1728 普通平衡树 or 洛谷 P3369 【模板】普通平衡树-Splay树模板题

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 22483  Solved: 10130[Submit][S ...

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

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

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

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

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

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

  8. bzoj 3224: Tyvj 1728 普通平衡树 && loj 104 普通平衡树 (splay树)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 思路: splay树模板题: 推荐博客:https://blog.csdn.ne ...

  9. bzoj 3224: Tyvj 1728 普通平衡树【非旋treap】

    就是非旋treap的板子 #include<iostream> #include<cstdio> #include<cstdlib> using namespace ...

随机推荐

  1. Eclipse 分屏显示同一个文件

    场景 : 某个类很大,可能有数千行.当你想要将类开头部分与中间或者靠后的部分进行对比时,请follow如下步骤: Window -> Editor -> Toggle Split Edit ...

  2. 伪造Http头拿flag

    <?php function GetIP(){ if(!empty($_SERVER["HTTP_CLIENT_IP"])) $cip = $_SERVER["HT ...

  3. canvas仿屏幕保护运动线条

    canvas是H5中及其重要的一个新标签,它得出现不仅让前端做图形图表功能变得异常强大,还用极强的性能丰富前端渲染页面的能力. Life is not a problem to be solved, ...

  4. Maven 的 HelloWorld

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  5. Java 操作 Redis 高级

    /Users/sherry/WorkPath/Git/Web/redisDemo/src/main/java/org/zln/utils/JedisUtils.java package org.zln ...

  6. 不支持一个 STA 线程上针对多个句柄的 WaitAll

    [csharp] view plaincopy using System; using System.Collections.Generic; using System.Windows.Forms; ...

  7. [PY]进制转换

    ord('j') 将字符转换为10进制 int(ord(‘j’),16) 把10进制转化为16进制 http://www.108kb.com/python/item/43662.htm http:// ...

  8. Jquery 将表单序列化为Json对象

    大家知道Jquery中有serialize方法,可以将表单序列化为一个“&”连接的字符串,但却没有提供序列化为Json的方法.不过,我们可以写一个插件实现. 我在网上看到有人用替换的方法,先用 ...

  9. freemarker语法简介

    ftl是一种模板标记语言,用于渲染数据,输入html结构.语法简介如下: ${book.name} ${book.name?if_exists} //值是否存在 ${book.name??} //值是 ...

  10. IT客学院《构建高转化率的着陆页-PS+HTML+网络营销》共25节【价值199元】无水印版

    课程简介本课程是全网独家专业的着陆页课程,课程完整的再现了整个着陆页实战案例的开发过程,包括:策划.设计和实现.上线后的推广.优化及提高转化率的技巧等,本套课程能帮助您迅速掌握着陆页的能力,迅速洞察完 ...