题目传送门

普通平衡树

题目大意

您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:

插入 xx 数
删除 xx 数(若有多个相同的数,因只删除一个)
查询 xx 数的排名(排名定义为比当前数小的数的个数 +1+1 )
查询排名为 xx 的数
求 xx 的前驱(前驱定义为小于 xx,且最大的数)
求 xx 的后继(后继定义为大于 xx,且最小的数)

思路

Splay模板题,Splay的详细讲解可以参考大佬讲解
Splay树详解
仅用此题记录模板

AC Code

/*
插入数值x。
删除数值x(若有多个相同的数,应只删除一个)。
查询数值x的排名(若有多个相同的数,应输出最小的排名)。
查询排名为x的数值。
求数值x的前驱(前驱定义为小于x的最大的数)。
求数值x的后继(后继定义为大于x的最小的数)。
*/
#include <bits/stdc++.h>
using namespace std;
const int N=201000;
struct splay_tree
{int ff,cnt,ch[2],val,size;
} t[N];
int root,tot;
void update(int x)
{t[x].size=t[t[x].ch[0]].size+t[t[x].ch[1]].size+t[x].cnt;
}
void rotate(int x)
{int y=t[x].ff;int z=t[y].ff;int k=(t[y].ch[1]==x);t[z].ch[(t[z].ch[1]==y)]=x;t[x].ff=z;t[y].ch[k]=t[x].ch[k^1];t[t[x].ch[k^1]].ff=y;t[x].ch[k^1]=y;t[y].ff=x;update(y);update(x);
}
void splay(int x,int s)
{while(t[x].ff!=s){int y=t[x].ff,z=t[y].ff;if (z!=s)(t[z].ch[0]==y)^(t[y].ch[0]==x)?rotate(x):rotate(y);rotate(x);}if (s==0)root=x;
}
void find(int x)
{int u=root;if (!u)return ;while(t[u].ch[x>t[u].val] && x!=t[u].val)u=t[u].ch[x>t[u].val];splay(u,0);
}
void insert(int x)
{int u=root,ff=0;while(u && t[u].val!=x){ff=u;u=t[u].ch[x>t[u].val];}if (u)t[u].cnt++;else{u=++tot;if (ff)t[ff].ch[x>t[ff].val]=u;t[u].ch[0]=t[u].ch[1]=0;t[tot].ff=ff;t[tot].val=x;t[tot].cnt=1;t[tot].size=1;}splay(u,0);
}
int Next(int x,int f)
{find(x);int u=root;if (t[u].val>x && f)return u;if (t[u].val<x && !f)return u;u=t[u].ch[f];while(t[u].ch[f^1])u=t[u].ch[f^1];return u;
}
void Delete(int x)
{int last=Next(x,0);int Net=Next(x,1);splay(last,0);splay(Net,last);int del=t[Net].ch[0];if (t[del].cnt>1){t[del].cnt--;splay(del,0);}elset[Net].ch[0]=0;
}
int kth(int x)
{int u=root;while(t[u].size<x)return 0;while(1){int y=t[u].ch[0];if (x>t[y].size+t[u].cnt){x-=t[y].size+t[u].cnt;u=t[u].ch[1];}else if (t[y].size>=x)u=y;elsereturn t[u].val;}
}
int main()
{int n;scanf("%d",&n);insert(1e9);insert(-1e9);while(n--){int opt,x;scanf("%d%d",&opt,&x);if (opt==1)insert(x);if (opt==2)Delete(x);if (opt==3){find(x);printf("%d\n",t[t[root].ch[0]].size);}if (opt==4)printf("%d\n",kth(x+1));if (opt==5)printf("%d\n",t[Next(x,0)].val);if (opt==6)printf("%d\n",t[Next(x,1)].val);}return 0;
}

P3369 (Splay树模板)相关推荐

  1. poj 3468 Splay 树

    大二上的时候.写过一个AVL的操作演示,今天一看Splay.发现和AVL事实上一样,加上线段树的基础,懒惰标记什么都知道.学起来轻松很多哦 我參考的模板来自这里  http://blog.csdn.n ...

  2. (转)Splay伸展树模板

    讲解博客:https://www.luogu.com.cn/blog/user19027/solution-p3369 模板博客:https://blog.csdn.net/clove_unique/ ...

  3. 平衡树【Splay树】学习小记

    简介 平衡树,顾名思义,平衡的搜索二叉树. 常见的平衡树都能将树的深度保持在 lg ⁡ n \lg_n lgn​ 的级别内,防止退化成链. 一些平衡树可以通过旋转.分裂.合并等操作完成更加高级的.二叉 ...

  4. 8.1 Splay树

    参考博客: https://blog.csdn.net/hellochenlu/article/details/53022709 参考博客: https://blog.csdn.net/amoscyk ...

  5. AVL树、splay树(伸展树)和红黑树比较

    AVL树.splay树(伸展树)和红黑树比较 一.AVL树: 优点:查找.插入和删除,最坏复杂度均为O(logN).实现操作简单 如过是随机插入或者删除,其理论上可以得到O(logN)的复杂度,但是实 ...

  6. python 回溯法 子集树模板 系列 —— 3、0-1背包问题

    问题 给定N个物品和一个背包.物品i的重量是Wi,其价值位Vi ,背包的容量为C.问应该如何选择装入背包的物品,使得放入背包的物品的总价值为最大? 分析 显然,放入背包的物品,是N个物品的所有子集的其 ...

  7. python 回溯法 子集树模板 系列 —— 5、取物搭配问题

    问题 有5件不同的上衣,3条不同的裤子,4顶不同的帽子,从中取出一顶帽子.一件上衣和一条裤子作为一种搭配,问有多少种不同的搭配? 分析 换个角度看,现有头.身.腿三个元素,每个元素都有各自的几种状态. ...

  8. poj2104(划分树模板)

    poj2104 题意 给出一个序列,每次查询一个区间,要求告诉这个区间排序后的第k个数. 分析 划分树模板,O(mlogn). 建树.根据排序之后的数组,对于一个区间,找到中点的数,将整个区间分为左右 ...

  9. hdu1156(简单线段树 模板题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  10. 线段树模板hdu 1754:I Hate It

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

最新文章

  1. 学 Redis ,至少要看看这篇!7000 字小结
  2. Oracle错误ORA-01800——ORA-01899
  3. Android注解学习(2)
  4. drools简单应用
  5. liunx下pytorch(python2.7)先前几个版本的安装(由于官网点击先前版本进不去)
  6. mysql 控制台环境下查询中文数据乱码,插入、更新中文数据不成功
  7. 类加载器 java委托机制_解析Java虚拟机中类的初始化及加载器的父委托机制
  8. ORACLE数据类型与java数据类型对应
  9. Linux学习笔记(6)
  10. layui文档通读笔记
  11. 计算机兼容性测试怎么做,如何进行兼容性测试
  12. Kaggle泰坦尼克号幸存者预测
  13. C++ 60分钟入门教程 - 1、绪论
  14. java过滤微信昵称emoji表情
  15. springboot基于Java web的电动车销售平台毕业设计源码201524
  16. 1 微信公众平台数据统计功能的作用是什么?
  17. C++和Rust_自从尝了 Rust,Java 突然不香了
  18. 谷歌adwords—点击诱饵被拒登
  19. 充满春天气息的公众号文章
  20. 实战与分享更换域名的SEO情况

热门文章

  1. openstack项目进展
  2. SaaS服务应用集成和生态该何去何从
  3. 耦合是什么?如何做到解耦?
  4. 电脑可以使用QQ,但是无法上网的解决方案
  5. httpclient简单应用,登录开心网的例子
  6. 图像压缩编码和解码原理——阐述了DCT变换的实质
  7. StringBuilder和StringBuffer的效率比较
  8. QT的自动滚动区QScrollArea的用法,图文详解
  9. 一款适用甲方企业的外网资产周期性扫描监控系统
  10. 20000条笑话保证笑死你