[Splay模版1]
输入
输出
若干行:每行1个整数,表示针对询问的回答,保证一定有合法的解
样例输入
样例输出
Splay模版
注意在平衡树中要加入INF 和 -INF 避免找不到比L小的数和比R大的数
细节在代码中:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<ctime>
using namespace std;
const int N=,INF=;
struct node
{
node *child[],*fa;
int x;
}a[N];
node *pos=a,*root;
void newnode(node *&r,int key,node *&fa)
{
r=pos++;
r->child[]=r->child[]=NULL;
r->x=key;r->fa=fa;
} void insert(node *&r,int key,node *fa)
{
if(r==NULL){
newnode(r,key,fa);
return ;
}
insert(r->child[key>r->x],key,r);
}
node *pre,*nxt;
void rotate(node *&r,bool t)//0left 1right
{
node *y=r->fa;
y->child[!t]=r->child[t];
if(r->child[t])r->child[t]->fa=y;
if(y->fa)y->fa->child[y->fa->child[]==y]=r;
r->fa=y->fa;
r->child[t]=y;
y->fa=r;
}
void check(node *r)//输出整个SPLAY
{
if(r==NULL)return ;
printf("x=%d lchild=%d rchild=%d\n",r->x,(r->child[]==NULL?NULL:r->child[]->x),r->child[]==NULL?NULL:r->child[]->x);
check(r->child[]);
check(r->child[]);
}
void getpre(node *r,int key)
{
if(r==NULL)return ;
if(key<=r->x)getpre(r->child[],key);
else pre=r,getpre(r->child[],key);
}
void getnext(node *r,int key)
{
if(r==NULL)return ;
if(key>=r->x)getnext(r->child[],key);
else nxt=r,getnext(r->child[],key);
}
void getans(node *r,int key)
{
if(r==NULL)return ;
if(key<r->x)getans(r->child[],key);//注意这里key<r->x不能取等
else pre=r,getans(r->child[],key);
}
void splay(node *r,node *g)
{
while(r->fa!=g)
{
if(r->fa->fa==g)rotate(r,r->fa->child[]==r);
else{
node *y=r->fa;
bool b=y->fa->child[]==y;
if(y->child[b]==r)rotate(r,!b);
else rotate(y,b);
rotate(r,b);
}
}
if(g==NULL)root=r;
} void work(int l,int r)
{
getpre(root,l);getnext(root,r);
splay(pre,NULL);
splay(nxt,pre);
root->child[]->child[]=NULL;
}
void haha()//**********插入INF 和 -INF 避免找不到小于l和大于r的数*************
{
insert(root,INF,NULL);insert(root,-INF,NULL);
return ;
}
int main()
{
haha();
int n,x,y;char ch;
scanf("%d",&n);
while(n--)
{
scanf("\n%c%d",&ch,&x);
if(ch=='I'){
insert(root,x,NULL);
}
if(ch=='Q'){
getans(root,x);
printf("%d\n",pre->x);
}
if(ch=='D'){
scanf("%d",&y);
work(x,y);
}
}
}
[Splay模版1]的更多相关文章
- splay模版
//splay模版 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstrin ...
- [bzoj1269][AHOI2006文本编辑器editor] (splay模版题 or pb_ds [rope]大法)
Description 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器.你能帮助他吗?为了明确任务目标,可可对“文本编辑器”做了一个抽象的定义: 文本:由0个或 ...
- _bzoj3224 Tyvj 1728 普通平衡树【Splay】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3224 保存splay模版 一刻不停写了一个小时多一点,幸好一遍过了!(其实带着freopen ...
- tyvj 1729 文艺平衡树
文艺平衡树 From admin 背景 Background 此为平衡树系列第二道:文艺平衡树 描述 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以 ...
- bzoj3223 文艺平衡树 codevs3303 翻转区间
splay模版题吧 只有区间翻转 至于为什么要把须翻转区间旋到根 因为查找一个区间可以先找出他左端点左边第一个点和右端点x右边第一个点y 然后将x旋到根节点 y旋到x的右儿子 这样x的右边的点就是所有 ...
- ZJOI2006书架
追yql做题记录的时候做到的……一道Splay模版题…… 啊LCT写久了都有点忘了Splay了(什么奇怪的逻辑?) 其实说白了五个操作: 1. 将某元素置顶:将元素旋到根,然后将左子树合并到该元素的后 ...
- 1439. Battle with You-Know-Who(splay树)
1439 路漫漫其修远兮~ 手抄一枚splay树 长长的模版.. 关于spaly树的讲解 网上很多随手贴一篇 貌似这题可以用什么bst啦 堆啦 平衡树啦 等等 这些本质都是有共同点的 查找.删除特 ...
- BZOJ3224普通平衡树【Splay】
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 11751 Solved: 5013 Descriptio ...
- Luogu1486郁闷的出纳员【Splay】
P1486 郁闷的出纳员 题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反 ...
随机推荐
- php学习测试题目
<?php header("content-type:text/html;charset=utf-8"); /* 1.银行给客户每天万分之四的利率,本金10 ...
- webpack 打包js和css
首先进行全局安装webpack npm install -g webpackcmd跳转到项目的文件夹,安装webpack npm install --save-dev webpack接着需要packj ...
- 模拟一个shuffle
之所以会想到写这么一个shuffle的例子,是因为一个需求:我需要把一个有序数组中的数据随机的打散.java代码如下, public void shuffle() { int[] arr = {1,2 ...
- Servlet+jsp的分页案例
查询的分页,在web中经常用到.一般,分页要维护的信息很多,我们把这些相关的信息,分装到一个类中,PageBean.具体如下: package cn.itcast.utils; import java ...
- Mac系统安装nginx+rtmp模块
1.安装命令 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install) ...
- javaScript绑定事件委托 demo
事件绑定通常发生在 onload 或 DOMContentReady , 事件绑定占用 处理时间 占用内存, 而且不是每个事件都会被 点击执行. 由此 事件委托 可以优化事件绑定行为.. 事件逐层冒泡 ...
- vue学习笔记 模板语法(三)
<div id="kk"> <div>直接输出文本:{{msg}}</div> <div>自定义过滤器输出文本:{{msg|capi ...
- 相机标定:kalibr标定工具箱使用总结
1 多相机标定 1.1采集图像和IMU 1.2制作Bag包 1)组织文件结构 ~/kalibr_workspace/test/stereo_calib bagsrc cam0 (1+time(0))* ...
- Jmeter-元件的作用域和执行顺序
Jmeter有8类可执行的元件,包括:逻辑控制器.配置元件.定时器.前置处理器.取样器.后置处理器.断言和监听器. 测试计划和线程组不属于元件. 1)取样器(Sampler):不与其他元件发生交互作用 ...
- Linux命令--su与sudo
su(switch user)命令的作用:切换用户,一般是普通用户与root用户之间的切换.例:>su #输入su命令Password: #提示输入密码 ...