3224: Tyvj 1728 普通平衡树

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 11751  Solved: 5013

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]
模版题万岁!
对于一个初学者而而言,Rotate是一个很重要的操作(然而难写),我刚开始写的时候就因为顺序打错而调了好久。所以建议zig和zag分开来写,现不要用异或操作免得出错。
之字形和一字形其实多看看就可以彻底理解的。
 #include<iostream>
 #include<cstdio>
 using namespace std;
 ;
 ,root=;
 inline void update(int x)
 {
     size[x]=num[x];
     if(lch[x])size[x]+=size[lch[x]];
     if(rch[x])size[x]+=size[rch[x]];
 }
 inline void zig(int x)///x==lch[f]
 {
     int f=F[x],gf=F[f];
     F[f]=x;
     F[x]=gf;
     if(gf) if(lch[gf]==f) lch[gf]=x;else if(rch[gf]==f) rch[gf]=x;
     lch[f]=rch[x];
     F[rch[x]]=f;
     rch[x]=f;
     update(f);
     update(x);
 }
 inline void zag(int x)///x==rch[f]
 {
     int f=F[x],gf=F[f];
     F[f]=x;
     F[x]=gf;
     if(gf) if(lch[gf]==f) lch[gf]=x;else if(rch[gf]==f) rch[gf]=x;
     rch[f]=lch[x];
     F[lch[x]]=f;
     lch[x]=f;
     update(f);
     update(x);
 }
 inline void splay(int x)
 {
     int f,gf;
     )
     {
         f=F[x];
         gf=F[f];
         )
         {
             if(x==lch[f]) zig(x);
             else zag(x);
             break;
         }
         if(f==lch[gf]&&x==lch[f]){zig(f);zig(x);}
         else if(f==rch[gf]&&x==rch[f]){zag(f);zag(x);}
         else if(f==rch[gf]&&x==lch[f]){zig(x);zag(x);}
         else{zag(x);zig(x);}
     }
     root=x;
 }
 inline int find(int x)
 {
     int p=root;
     while(x!=key[p])
     {
         if(x<key[p])
         {
             ) break;
             else p=lch[p];
         }
         else
         {
             ) break;
             else p=rch[p];
         }
     }
     return p;
 }
 inline void ins(int x)
 {
     )
     {
         key[++sz]=x;
         size[]=;
         num[]=;
         root=;
         F[sz]=;
         return;
     }
     int p=find(x);
     if(key[p]!=x)
     {
         key[++sz]=x;
         num[sz]=;
         F[sz]=p;
         if(x<key[p]) lch[p]=sz;
         else rch[p]=sz;
         lch[sz]=rch[sz]=;
         p=sz;
     }
     num[p]++;
     update(p);
     update(F[p]);
     splay(p);
 }
 inline int findmax(int p)
 {
     ) p=rch[p];
     return p;
 }
 inline int findmin(int p)
 {
     ) p=lch[p];
     return p;
 }
 inline void del(int x)
 {
     int p=find(x);
     splay(p);
     num[p]--;
     )
     {
         int f=F[p];
         ) {root=rch[p];F[rch[p]]=;}
         ) {root=lch[p];F[lch[p]]=;}
         else
         {
             int l=findmax(lch[p]),r=rch[p];
             F[lch[p]]=;
             splay(l);
             rch[l]=r;
             F[r]=l;
             update(l);
         }
     }
 }
 inline int findn(int x,int p)
 {
     if(size[lch[p]]<x&&x<=size[lch[p]]+num[p]) return p;
     else if(x<=size[lch[p]]) return findn(x,lch[p]);
     else if(rch[p]) return findn(x-size[lch[p]]-num[p],rch[p]);
 }
 int main()
 {
     int t,n,p,x;
     scanf("%d",&n);
     ;i<=n;i++)
     {
         scanf("%d%d",&t,&x);
         ) ins(x);
         ) del(x);
         ) {splay(find(x));printf();}
         ) printf("%d\n",key[findn(x,root)]);
         ) {ins(x);printf("%d\n",key[findmax(lch[root])]);del(x);}
         ) {ins(x);printf("%d\n",key[findmin(rch[root])]);del(x);}
     }
     ;
 }

BZOJ3224普通平衡树【Splay】的更多相关文章

  1. bzoj3224 普通平衡树(splay 模板)

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 11427  Solved: 4878[Submit][St ...

  2. BZOJ3224:普通平衡树(Splay)

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

  3. [luogu3369/bzoj3224]普通平衡树(splay模板、平衡树初探)

    解题关键:splay模板题整理. 如何不加入极大极小值?(待思考) #include<cstdio> #include<cstring> #include<algorit ...

  4. bzoj3224 普通平衡树 splay模板

    题目传送门 题目大意:完成一颗splay树. 思路:模板题,学着还是很有意思的. 学习splay树:蒟蒻yyb 该题模板:汪立超 #include<bits/stdc++.h> #defi ...

  5. 【BZOJ3224】Tyvj 1728 普通平衡树 Splay

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

  6. BZOJ3224/洛谷P3391 - 普通平衡树(Splay)

    BZOJ链接 洛谷链接 题意简述 模板题啦~ 代码 //普通平衡树(Splay) #include <cstdio> int const N=1e5+10; int rt,ndCnt; i ...

  7. 【转】 史上最详尽的平衡树(splay)讲解与模板(非指针版spaly)

    ORZ原创Clove学姐: 变量声明:f[i]表示i的父结点,ch[i][0]表示i的左儿子,ch[i][1]表示i的右儿子,key[i]表示i的关键字(即结点i代表的那个数字),cnt[i]表示i结 ...

  8. hiho #1329 : 平衡树·Splay

    #1329 : 平衡树·Splay 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,上一次你跟我讲了Treap,我也实现了.但是我遇到了一个关键的问题. ...

  9. Hihocoder 1329 平衡树·Splay(平衡树)

    Hihocoder 1329 平衡树·Splay(平衡树) Description 小Ho:小Hi,上一次你跟我讲了Treap,我也实现了.但是我遇到了一个关键的问题. 小Hi:怎么了? 小Ho:小H ...

  10. 【阶梯报告】洛谷P3391【模板】文艺平衡树 splay

    [阶梯报告]洛谷P3391[模板]文艺平衡树 splay 题目链接在这里[链接](https://www.luogu.org/problemnew/show/P3391)最近在学习splay,终于做对 ...

随机推荐

  1. 深度神经网络(DNN)反向传播算法(BP)

    在深度神经网络(DNN)模型与前向传播算法中,我们对DNN的模型和前向传播算法做了总结,这里我们更进一步,对DNN的反向传播算法(Back Propagation,BP)做一个总结. 1. DNN反向 ...

  2. 中间自适应,左右定宽的两种经典布局 ---- 圣杯布局 VS 双飞翼布局

    一.引子 最近学了些js框架,小有充实感,又深知如此节奏的前提需得基础扎实,于是回头想将原生CSS和Javascript回顾总结一番,先从CSS起,能集中它的就在基础的布局上,便查阅了相关资料,将布局 ...

  3. es6的解构赋值学习(1)

    相对es5的简单的"="赋值来说,es6增加了一种新的赋值模式--解构赋值,按照它的规则,可以从数组和对象中提取值来对变量进行赋值,个人觉得方便了很多,但是这个模式有点恶心人,相比 ...

  4. POJ 2396 Budget 有上下界的网络流

    POJ 2396  Budget 题意简述:给定矩阵(每个元素都是非负整数)各行各列的和,并且限制其中的某些元素,给出一个可行解,特殊评测.矩阵规模小于200*20. 网络流的模型是显而易见的,不过对 ...

  5. Unity3d中如何混用三种脚本语言?

    首先要明白,这三种说的混用是指文件级别的混用,就是说一个文件是由一种语言写的.而不是说你这一个文件可以混用这三种语言,注意这是不允许的. 第二要明白,在unity3d中为什么可以使用三种语言混合开发? ...

  6. 从SHAttered事件谈安全

    大新闻? 在刚刚过去的2017年2月23日,Cryptology Group at Centrum Wiskunde & Informatica (CWI)和Google的研究人员公开了2个P ...

  7. map,set,list等集合解析以及HashMap,LinkedHashMap,TreeMap等该选谁的的区别

    前言: 今天在整理一些资料时,想起了map,set,list等集合,于是就做些笔记,提供给大家学习参考以及自己日后回顾. Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允 ...

  8. 如何用好消息推送为app拉新、留存、促活

    作为移动端APP产品运营最重要的运营手段,JPush消息推送被越来越多的APP厂商所重视,在信息泛滥的移动互联网时代,手机APP应用安装得越来越多,小小的手机屏幕每天收到的消息推送也越来越多,站在用户 ...

  9. Jackson学习(一)

    Jackson的一些配置.使用方式以及效率方面的简单介绍. 1.jackson的maven依赖 <!-- jackson依赖 --> <dependency> <grou ...

  10. 使用Compute Shader加速Irradiance Environment Map的计算

    Irradiance Environment Map基本原理 Irradiance Environment Map(也叫Irradiance Map或Diffuse Environment Map), ...