P3369 (Splay树模板)
题目传送门
普通平衡树
题目大意
您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:
插入 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树模板)相关推荐
- poj 3468 Splay 树
大二上的时候.写过一个AVL的操作演示,今天一看Splay.发现和AVL事实上一样,加上线段树的基础,懒惰标记什么都知道.学起来轻松很多哦 我參考的模板来自这里 http://blog.csdn.n ...
- (转)Splay伸展树模板
讲解博客:https://www.luogu.com.cn/blog/user19027/solution-p3369 模板博客:https://blog.csdn.net/clove_unique/ ...
- 平衡树【Splay树】学习小记
简介 平衡树,顾名思义,平衡的搜索二叉树. 常见的平衡树都能将树的深度保持在 lg n \lg_n lgn 的级别内,防止退化成链. 一些平衡树可以通过旋转.分裂.合并等操作完成更加高级的.二叉 ...
- 8.1 Splay树
参考博客: https://blog.csdn.net/hellochenlu/article/details/53022709 参考博客: https://blog.csdn.net/amoscyk ...
- AVL树、splay树(伸展树)和红黑树比较
AVL树.splay树(伸展树)和红黑树比较 一.AVL树: 优点:查找.插入和删除,最坏复杂度均为O(logN).实现操作简单 如过是随机插入或者删除,其理论上可以得到O(logN)的复杂度,但是实 ...
- python 回溯法 子集树模板 系列 —— 3、0-1背包问题
问题 给定N个物品和一个背包.物品i的重量是Wi,其价值位Vi ,背包的容量为C.问应该如何选择装入背包的物品,使得放入背包的物品的总价值为最大? 分析 显然,放入背包的物品,是N个物品的所有子集的其 ...
- python 回溯法 子集树模板 系列 —— 5、取物搭配问题
问题 有5件不同的上衣,3条不同的裤子,4顶不同的帽子,从中取出一顶帽子.一件上衣和一条裤子作为一种搭配,问有多少种不同的搭配? 分析 换个角度看,现有头.身.腿三个元素,每个元素都有各自的几种状态. ...
- poj2104(划分树模板)
poj2104 题意 给出一个序列,每次查询一个区间,要求告诉这个区间排序后的第k个数. 分析 划分树模板,O(mlogn). 建树.根据排序之后的数组,对于一个区间,找到中点的数,将整个区间分为左右 ...
- hdu1156(简单线段树 模板题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- 线段树模板hdu 1754:I Hate It
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
最新文章
- 学 Redis ,至少要看看这篇!7000 字小结
- Oracle错误ORA-01800——ORA-01899
- Android注解学习(2)
- drools简单应用
- liunx下pytorch(python2.7)先前几个版本的安装(由于官网点击先前版本进不去)
- mysql 控制台环境下查询中文数据乱码,插入、更新中文数据不成功
- 类加载器 java委托机制_解析Java虚拟机中类的初始化及加载器的父委托机制
- ORACLE数据类型与java数据类型对应
- Linux学习笔记(6)
- layui文档通读笔记
- 计算机兼容性测试怎么做,如何进行兼容性测试
- Kaggle泰坦尼克号幸存者预测
- C++ 60分钟入门教程 - 1、绪论
- java过滤微信昵称emoji表情
- springboot基于Java web的电动车销售平台毕业设计源码201524
- 1 微信公众平台数据统计功能的作用是什么?
- C++和Rust_自从尝了 Rust,Java 突然不香了
- 谷歌adwords—点击诱饵被拒登
- 充满春天气息的公众号文章
- 实战与分享更换域名的SEO情况