bzoj3224: Tyvj 1728 普通平衡树(splay)
3224: Tyvj 1728 普通平衡树
题目:传送门
题解:
啦啦啦啦又来敲个模版水经验啦~
代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
struct node
{
int d,c,n,f,son[];
}tr[];int len,root;
void add(int d,int f)
{
len++;tr[len].d=d;tr[len].n=tr[len].c=;
tr[len].son[]=tr[len].son[]=;tr[len].f=f;
if(d<tr[f].d)tr[f].son[]=len;
else tr[f].son[]=len;
}
void update(int x)
{
int lc=tr[x].son[],rc=tr[x].son[];
tr[x].c=tr[lc].c+tr[rc].c+tr[x].n;
}
int findip(int d)
{
int x=root;
while(tr[x].d!=d)
{
if(d<tr[x].d)
{
if(tr[x].son[]==)break;
else x=tr[x].son[];
}
else
{
if(tr[x].son[]==)break;
else x=tr[x].son[];
}
}
return x;
}
void rotate(int x,int w)
{
int f=tr[x].f,ff=tr[f].f;
int r,R;
r=tr[x].son[w],R=f;
tr[R].son[-w]=r;
if(r!=)tr[r].f=R; r=x,R=ff;
if(tr[R].son[]==f)tr[R].son[]=r;
else tr[R].son[]=r;
tr[r].f=R; r=f,R=x;
tr[R].son[w]=r;
tr[r].f=R; update(f);update(x);
}
void splay(int x,int rt)
{
while(tr[x].f!=rt)
{
int f=tr[x].f,ff=tr[f].f;
if(ff==rt)
{
if(tr[f].son[]==x)rotate(x,);
else rotate(x,);
}
else
{
if(tr[ff].son[]==f && tr[f].son[]==x)rotate(f,),rotate(x,);
else if(tr[ff].son[]==f && tr[f].son[]==x)rotate(f,),rotate(x,);
else if(tr[ff].son[]==f && tr[f].son[]==x)rotate(x,),rotate(x,);
else if(tr[ff].son[]==f && tr[f].son[]==x)rotate(x,),rotate(x,);
}
}
if(rt==)root=x;
}
void ins(int d)
{
if(root==)
{
add(d,);root=len;
return ;
}
int x=findip(d);
if(tr[x].d==d)
{
tr[x].n++;
update(x);
splay(x,);
}
else
{
add(d,x);
update(x);
splay(len,);
}
}
void del(int d)
{
int x=findip(d);if(tr[x].d!=d)return ;
splay(x,);
if(tr[x].n>){tr[x].n--;update(x);return ;}
if(tr[x].son[]== && tr[x].son[]==){root=;len=;}
else if(tr[x].son[]!= && tr[x].son[]==){root=tr[x].son[];tr[root].f=;}
else if(tr[x].son[]== && tr[x].son[]!=){root=tr[x].son[];tr[root].f=;}
else
{
int p=tr[x].son[];
while(tr[p].son[]!=)p=tr[p].son[];
splay(p,x); int r=tr[x].son[],R=p;
tr[R].son[]=r;
tr[r].f=R; root=p;tr[root].f=;
update(root);
}
}
void findpaiming(int d)
{
int x=findip(d);splay(x,);int lc=tr[x].son[];
printf("%d\n",tr[lc].c+);
}
void findshuzi(int k)
{
if(tr[root].c<k){printf("-1\n");return ;}
int x=root;
while()
{
int lc=tr[x].son[],rc=tr[x].son[];
if(k<=tr[lc].c)x=lc;
else if(k>tr[lc].c+tr[x].n)k-=tr[lc].c+tr[x].n,x=rc;
else break;
}
printf("%d\n",tr[x].d);
}
void findqianqu(int d)
{
int x=findip(d);splay(x,);
if(d<=tr[x].d && tr[x].son[]!=)
{
x=tr[x].son[];
while(tr[x].son[]!=)x=tr[x].son[];
}
if(d<=tr[x].d)x=;
printf("%d\n",tr[x].d);
}
void findhouji(int d)
{
int x=findip(d);splay(x,);
if(d>=tr[x].d && tr[x].son[]!=)
{
x=tr[x].son[];
while(tr[x].son[]!=)x=tr[x].son[];
}
if(d>=tr[x].d)x=;
printf("%d\n",tr[x].d);
}
/*
void dell(int l,int r)
{
int lc=findqianqu(tr[l].d),rc=findhouji(tr[r].d);
spaly(lc,0);spaly(rc,lc);
tr[rc].son[0]=0;len-=tr[tr[rc].lc].c;
update(rc);update(lc);
}
*/
int main()
{
int n;scanf("%d",&n);root=;len=;
for(int i=;i<=n;i++)
{
int opt,d;scanf("%d%d",&opt,&d);
if(opt==)ins(d);
else if(opt==)del(d);
else if(opt==)findpaiming(d);
else if(opt==)findshuzi(d);
else if(opt==)findqianqu(d);
else if(opt==)findhouji(d);
}
return ;
}
bzoj3224: Tyvj 1728 普通平衡树(splay)的更多相关文章
- [bzoj3224]Tyvj 1728 普通平衡树——splay模板
题目 你需要写一种数据结构支援以下操作. 插入元素. 删除元素. 查询元素的排名. 查询第k小的元素. 查询元素前趋. 查询元素后继. 题解 BBST裸题. 代码 #include <cstdi ...
- bzoj3224: Tyvj 1728 普通平衡树(平衡树)
bzoj3224: Tyvj 1728 普通平衡树(平衡树) 总结 a. cout<<(x=3)<<endl;这句话输出的值是3,那么对应的,在splay操作中,当父亲不为0的 ...
- [BZOJ3224]Tyvj 1728 普通平衡树
[BZOJ3224]Tyvj 1728 普通平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个) ...
- bzoj3224 Tyvj 1728 普通平衡树(名次树+处理相同)
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 5354 Solved: 2196[Submit][Sta ...
- 【BZOJ3224】Tyvj 1728 普通平衡树 Splay
Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数 ...
- BZOJ3224 洛谷3369 Tyvj 1728 普通平衡树 splay
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3224 题意概括 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. ...
- 绝对是全网最好的Splay 入门详解——洛谷P3369&BZOJ3224: Tyvj 1728 普通平衡树 包教包会
平衡树是什么东西想必我就不用说太多了吧. 百度百科: 一个月之前的某天晚上,yuli巨佬为我们初步讲解了Splay,当时接触到了平衡树里的旋转等各种骚操作,感觉非常厉害.而第二天我调Splay的模板竟 ...
- bzoj3224: Tyvj 1728 普通平衡树(打个splay暖暖手)
(其实今天好热啊? 题目大意:插入,删除,k小,前驱后继,数的排名. splay和treap裸题...过几天补个treap的 splay: #include<iostream> #incl ...
- 【Splay】bzoj3224 Tyvj 1728 普通平衡树
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> us ...
随机推荐
- RabbitMQ 官方NET教程(四)【路由选择】
在上一个教程中,我们构建了一个简单的日志记录系统. 我们能够广播日志消息给所有你的接收者. 在本教程中,我们将为其添加一个功能 - 我们将让日志接收者可以仅订阅一部分消息. 例如,我们将能够仅将关键的 ...
- BootStrap 资源包的下载和使用
将附件中的包解压,放置webroot中,并在jsp页面中引用它们,即可以使用 bootstrap.rar (78.9 KB) 下载次数: 0
- 【JAVA练习】- 一个逻辑题
打印 1 3 4 5 8 12 7 12 20 32 9 16 28 48 80 ..... 输入任意一个奇数,输出那一行的数据 第一种方法找到规律进行 ...
- android中复制图片
activity_main.xml中的配置 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/androi ...
- js match 来点击切换图片
定义和用法 match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配. 该方法类似 indexOf() 和 lastIndexOf(),但是它返回指定的值,而不是字符串的位置. ...
- SQL Server存储过程作业(一)
创建客房类型表RoomType 创建客房状态表RoomState 创建客房信息表Room 创建结账状态表ResideState 创建客人信息表GuestRecord 编写sql语句 USE maste ...
- 来源页面地址 上一页面url
Uri uri = Request.UrlReferrer;
- 浅谈Json数据格式
我们先来看下w3cschool对json的定义: JSON:JavaScript 对象表示法(JavaScript Object Notation). JSON 是存储和交换文本信息的语法.类似 XM ...
- springboot:基础学习一 linux下后台启动springboot项目
我们知道启动springboot的项目有三种方式: 运行主方法启动 使用命令 mvn spring-boot:run”在命令行启动该应用 运行“mvn package”进行打包时,会打包成一个可以直接 ...
- vmware Horizon 7 与远程桌面(mstsc)兼容性问题解决办法
关于Horizon 7 Agent与远程桌面(mstsc)兼容性问题解决办法 在Horizon 7环境中,在桌面模板安装了Horizon Agent后,就无法直接通过微软的远程桌面(mstsc)工具连 ...