bzoj 3224: Tyvj 1728 普通平衡树 && loj 104 普通平衡树 (splay树)
题目链接:
https://www.lydsy.com/JudgeOnline/problem.php?id=3224
思路:
splay树模板题:
推荐博客:https://blog.csdn.net/clove_unique/article/details/50630280
b站上splay树的讲解视频也可以看下,讲的很好,推荐看完视频了解了splay的原理再写
实现代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int M = 1e5+;
const int inf = <<;
struct node{
int fa,s[],x,size,cnt;
}tr[M];
int top,root,n;
void pushup(int k){
tr[k].size = tr[tr[k].s[]].size+tr[tr[k].s[]].size+tr[k].cnt;
} void rotate(int k){
int x = tr[k].fa,y = tr[x].fa,b=tr[x].s[]==k;
tr[y].s[tr[y].s[]==x]=k;tr[k].fa=y;
tr[x].s[b]=tr[k].s[b^]; tr[tr[k].s[b^]].fa=x;
tr[k].s[b^]=x; tr[x].fa = k;
pushup(x); pushup(k);
} void splay(int x,int go){ //伸展操作
int y = tr[x].fa,z = tr[y].fa;
for(;tr[x].fa^go;rotate(x)){
y = tr[x].fa,z = tr[y].fa;
if(z^go) (tr[y].s[] == x)^(tr[z].s[]==y)?rotate(x):rotate(y);
}
if(!go) root = x;
} void insert(int x){ //插入操作
int u = root,fa = ;
for(;u&&tr[u].x^x;u=tr[u].s[x>tr[u].x]) fa = u;
if(u) tr[u].cnt++; //若已经有这个数了,到cnt++即可
else{ //新建一个节点
u = ++top;
if(fa) tr[fa].s[x>tr[fa].x] = u;
tr[top].fa = fa;tr[top].x = x;tr[top].cnt = tr[top].size = ;
}
splay(u,); //splay 到根
}
//这个函数还有一个功能是把一个跟x不相隔仍荷属的数转移到根
int rank(int x){ //查找x的排名
int u = root;
if(!u) return ;
for(;tr[u].s[x>tr[u].x]&&x^tr[u].x;u=tr[u].s[x>tr[u].x]);
splay(u,); //splay 到根
return tr[tr[u].s[]].size;
}
//求x的前驱后继
int next(int x,int f){ //f=0表示前驱,f=1表示后继,返回的是编号
rank(x); //将与x不相隔任何数的数转移到根
int u = root;
if(tr[u].x>x&&f||tr[u].x<x&&!f) return u; //若已经是答案,则返回
u = tr[u].s[f];
while(tr[u].s[f^]) u = tr[u].s[f^]; //查找前驱时在左子树中查找最大值,后继反之
return u;
} void erase(int x){
int up = next(x,),lo = next(x,),u; //得到前驱后继
splay(lo,); splay(up,lo); //移成一个好局面
u = tr[up].s[];
if(tr[u].cnt > ){
tr[u].cnt--;
splay(u,);
}
else {
tr[up].s[] = ;
pushup(up); pushup(lo);
}
} int find(int x){
x++;
int u = root,son;
if(tr[u].size < x) return ; //没有这个数
while(){
son = tr[u].s[];
if(tr[son].size >= x) u = son;
else if(x>tr[son].size+tr[u].cnt)
x -= tr[son].size + tr[u].cnt, u = tr[u].s[];
else break;
}
splay(u,);
return tr[u].x;
} int main(){
scanf("%d",&n);
int op,x;
insert(-inf); insert(inf);
for(int i = ;i <= n;i ++){
scanf("%d%d",&op,&x);
switch(op){
case : insert(x);break;
case : erase(x); break;
case : printf("%d\n",rank(x));break;
case : printf("%d\n",find(x)); break;
case : printf("%d\n",tr[next(x,)].x); break;
case : printf("%d\n",tr[next(x,)].x); break;
}
}
return ;
}
bzoj 3224: Tyvj 1728 普通平衡树 && loj 104 普通平衡树 (splay树)的更多相关文章
- BZOJ 3224: Tyvj 1728 普通平衡树
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 9629 Solved: 4091[Submit][Sta ...
- BZOJ 3224 TYVJ 1728 普通平衡树 [Treap树模板]
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 7390 Solved: 3122 [Submit][S ...
- BZOJ 3224: Tyvj 1728 普通平衡树 treap
3224: Tyvj 1728 普通平衡树 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除 ...
- BZOJ 3224: Tyvj 1728 普通平衡树 vector
3224: Tyvj 1728 普通平衡树 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除 ...
- BZOJ 3224: Tyvj 1728 普通平衡树(BST)
treap,算是模板题了...我中间还一次交错题... -------------------------------------------------------------------- #in ...
- BZOJ 3224: Tyvj 1728 普通平衡树 or 洛谷 P3369 【模板】普通平衡树-Splay树模板题
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 22483 Solved: 10130[Submit][S ...
- BZOJ 3224 Tyvj 1728 普通平衡树模板
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 题目大意: 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以 ...
- bzoj 3224/Tyvj 1728 普通平衡树(splay)
Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数 ...
- fhq_treap || BZOJ 3224: Tyvj 1728 普通平衡树 || Luogu P3369 【模板】普通平衡树
题面:[模板]普通平衡树 代码: #include<cstdio> #include<cstring> #include<iostream> #include< ...
随机推荐
- highcharts为X轴标签添加链接
$(function () { var categoryLinks = { 'Foo': 'http://www.google.com/search?q=foo', 'Bar': 'http://ww ...
- Webpack 概念
概念 webpack 是一个现代的 JavaScript 应用程序的模块打包器(module bundler).当 webpack 处理应用程序时,它会递归地构建一个依赖关系图表(dependency ...
- LOJ550 Matching 构造
传送门 题意:$T$组询问,每组询问给出一个$N \times M$的网格和一个$K$,每一次你可以消除网格中的两个块,如果两个块的曼哈顿距离小于$K$,则不会得到分数,否则得到等同于它们曼哈顿距离的 ...
- P4770 [NOI2018]你的名字
蒟蒻表示不会sam凉凉了,所以只能提高SA技巧? 题意:有一个串\(A\),每次选择一个\(A\)的子串\(A'\),以及串\(B\),问\(B\)的所有本质不同子串中不在\(A'\)中的串的数量. ...
- (8)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- Ocelot网关(Api GateWay)
说到现在现有微服务的几点不足: 1) 对于在微服务体系中.和 Consul 通讯的微服务来讲,使用服务名即可访问.但是对于手 机.web 端等外部访问者仍然需要和 N 多服务器交互,需要记忆他们的服务 ...
- Mvc_后端通用验证
namespace Web.Mvc.Extensions { #region 验证基类 /// <summary> /// 通用验证基类 /// </summary> publ ...
- Redis未授权访问漏洞的利用及防护
Redis未授权访问漏洞的利用及防护 什么是Redis未授权访问漏洞? Redis在默认情况下,会绑定在0.0.0.0:6379.如果没有采取相关的安全策略,比如添加防火墙规则.避免其他非信任来源IP ...
- wordcount程序
wordcount程序算是相比于前几次作业来说比较难得一个作业了.进行了一次真的自己编写程序.WC程序实现了对txt文件中的数据的计数,算出程序中有多少单词.字符数以及行数.这次的程序编程是采用的C语 ...
- 12.17 Daily Scrum
Today's Task Tomorrow's Task 丁辛 实现和菜谱相关的餐厅列表. 实现和菜谱相关的餐厅列表. 邓亚梅 美化搜索框UI. 美 ...
- linux第一次读书笔记
第一章 LINUX内核简介 1.1 Unix的历史 1969年的夏天,贝尔实验室的程序员们在一台PDR-7型机上实现了Unix这个全新的操作系统. 1973年,整个Unix系统用C语言进行了重写,给后 ...