1439. Battle with You-Know-Who(splay树)
路漫漫其修远兮~
手抄一枚splay树 长长的模版。。
关于spaly树的讲解 网上很多随手贴一篇 貌似这题可以用什么bst啦 堆啦 平衡树啦 等等 这些本质都是有共同点的 查找、删除特别快 因为都有序 而且平衡~
看题很容易想到用线段树做 不过数太大了 离散化嘛 你肯定这么想 不过这题真不好离散 没想出来 只能硬啃这树那树了
用splay树存下被删除的数 为原先的第几 再根据左边有多少个节点 右边有多少个节点 与询问的数比较大小 看他具体该在哪个位置
每插入一个数 就把它旋到根节点 这样会节省时间 应该跟输入数据有关 我试了把询问时的那步旋转去掉 跑得死慢了
看代码吧 挺有意思的
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#define N 10010
using namespace std;
int n,m;
struct splaytree
{
int size[N],ch[N][],f[N],va[N];
int root,top;
inline void zig(int x)
{
int y = f[x],z = f[y];
ch[y][] = ch[x][];f[ch[x][]] = y;
f[x] = z;ch[x][] = y;f[y] = x;
if(z) ch[z][ch[z][]==y] = x;
pushup(y);
}
inline void zag(int x)
{
int y = f[x],z = f[y];
ch[y][] = ch[x][];f[ch[x][]] = y;
ch[x][] = y;f[y] = x;f[x] = z;
if(z) ch[z][ch[z][]==y] = x;
pushup(y);
}
inline void zigzig(int x)
{
int y = f[x],z = f[y],fz = f[z];
ch[z][] = ch[y][]; f[ch[y][]] = z;
ch[y][] = ch[x][]; f[ch[x][]] = y;
f[z] = y;ch[y][] = z;
f[y] = x;ch[x][] = y;
f[x] = fz;
if(fz) ch[fz][ch[fz][]==z] = x;
pushup(z);pushup(y);
}
inline void zagzag(int x){ int y=f[x], z=f[y], fz=f[z]; ch[z][]=ch[y][]; f[ch[y][]]=z; ch[y][]=ch[x][]; f[ch[x][]]=y; f[z] = y;ch[y][] = z;
f[y] = x;ch[x][] = y;
f[x] = fz;
if(fz) ch[fz][ch[fz][]==z] = x;
pushup(z);pushup(y);
}
inline void zigzag(int x)
{
int y = f[x],z = f[y],fz = f[z];
ch[y][] = ch[x][] ; f[ch[x][]] = y;
ch[z][] = ch[x][] ; f[ch[x][]] = z;
f[z] = x;ch[x][] = y;
f[y] = x;ch[x][] = z;
f[x] = fz;
if(fz) ch[fz][ch[fz][]==z] = x;
pushup(y);pushup(z);
}
inline void zagzig(int x)
{
int y = f[x],z = f[y],fz = f[z];
ch[y][] = ch[x][] ; f[ch[x][]] = y;
ch[z][] = ch[x][] ; f[ch[x][]] = z;
f[z] = x;ch[x][] = z;
f[y] = x;ch[x][] = y;
f[x] = fz;
if(fz) ch[fz][ch[fz][]==z] = x;
pushup(y);pushup(z);
}
void splay(int x,int goal)
{
int y,z;
while(f[x]!=goal)
{
if(f[f[x]]==goal)
{
y = f[x];
if(ch[y][]==x)
zig(x);
else
zag(x);
}
else
{
y = f[x];z =f[y];
if(ch[z][]==y)
{
if(ch[y][]==x)
zigzig(x);
else
zagzig(x);
}
else
{
if(ch[y][]==x)
zagzag(x);
else
zigzag(x);
}
}
}
pushup(x);
if(f[x]==)
root = x;
}
inline void pushup(int x)
{
size[x] = size[ch[x][]]+size[ch[x][]]+;
}
void init()
{
size[] = ch[][] = ch[][] = f[] = root = va[] = top = ;
insert();
}
inline int newnode(int v)
{
size[++top] = ;
ch[top][] = ch[top][] = f[top] = ;
va[top] = v;
return top;
}
void insert(int v)
{
int r = root,x;
for(;;)
{
if(v>=va[r])
{
if(ch[r][])
r = ch[r][];
else
{
x = newnode(v);
ch[r][] = x;
f[x] = r;
break;
}
}
else
{
if(ch[r][])
r = ch[r][];
else
{
x = newnode(v);
ch[r][] = x;
f[x] = r;
break;
}
}
}
splay(x,);
}
int query(int v)
{
int r = root,k = v,res = size[ch[root][]];
for(;;)
{
if(k<va[r]-res)
{
if(ch[r][])
{
r = ch[r][];
res -= size[ch[r][]]+;
}
else
{
splay(r,);
return k+res;
}
}
else
{
if(ch[r][])
{
r = ch[r][];
res += +size[ch[r][]];
}
else
{
splay(r,);
return k+res+;
}
}
}
}
}tree;
int main()
{
int k;
char s[];
tree.init();
scanf("%d%d",&n,&m);
while(m--)
{
scanf("%s%d",s,&k);
if(s[]=='L')
printf("%d\n",tree.query(k));
else
{
int x = tree.query(k);
tree.insert(x);
}
}
return ;
}
1439. Battle with You-Know-Who(splay树)的更多相关文章
- Splay树-Codevs 1296 营业额统计
Codevs 1296 营业额统计 题目描述 Description Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司 ...
- ZOJ3765 Lights Splay树
非常裸的一棵Splay树,需要询问的是区间gcd,但是区间上每个数分成了两种状态,做的时候分别存在val[2]的数组里就好.区间gcd的时候基本上不支持区间的操作了吧..不然你一个区间里加一个数gcd ...
- Splay树再学习
队友最近可能在学Splay,然后让我敲下HDU1754的题,其实是很裸的一个线段树,不过用下Splay也无妨,他说他双旋超时,单旋过了,所以我就敲来看下.但是之前写的那个Splay越发的觉得不能看,所 ...
- 暑假学习日记:Splay树
从昨天开始我就想学这个伸展树了,今天花了一个上午2个多小时加下午2个多小时,学习了一下伸展树(Splay树),学习的时候主要是看别人博客啦~发现下面这个博客挺不错的http://zakir.is-pr ...
- 伸展树(Splay树)的简要操作
伸展树(splay树),是二叉排序树的一种.[两个月之前写过,今天突然想写个博客...] 伸展树和一般的二叉排序树不同的是,在每次执行完插入.查询.删除等操作后,都会自动平衡这棵树.(说是自动,也就是 ...
- [Splay伸展树]splay树入门级教程
首先声明,本教程的对象是完全没有接触过splay的OIer,大牛请右上角.. 首先引入一下splay的概念,他的中文名是伸展树,意思差不多就是可以随意翻转的二叉树 PS:百度百科中伸展树读作:BoGa ...
- hdu 3436 splay树+离散化*
Queue-jumpers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- hdu 1890 splay树
Robotic Sort Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
- hdu3487 splay树
Play with Chain Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
随机推荐
- dbt
Procedure Relocate(s : state; b : base_index) { Move base for state s to a new place beginning at b ...
- apache配置网站目录的读写权限
分享下apache中配置网站目录文件权限的方法. 假设http服务器运行用户和用户组是www,网站用户为centos,网站根目录是/home/centos/web. 操作方法与步骤:1,首先,设定网站 ...
- YII千万级PV架构经验分享--俯瞰篇--性能介绍
一张图,啥也不说了.直接上图,大图真难画. 呃,非得写满二百个字,其实本来想画均衡负债,一些服务器假设列子的,突然发现,没有业务要求,画不出来.写了这么久了,天天熬夜,得休息几天再继续.其实还有非常重 ...
- DOM基础总结
一.简介 1.什么是DOM 文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口.它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式 ...
- 浏览器内核-Webkit
关键字:浏览器内核,浏览器引擎,Browser,Webkit,Blink,Chromium. 本文简单介绍一下各种浏览器内核.着种介绍一下Webkit.顾名思义,浏览器内核就是浏览器的核心部分,也可以 ...
- c 递归函数浅析
所谓递归,简而言之就是应用程序自身调用自身,以实现层次数据结构的查询和访问. 递归的使用可以使代码更简洁清晰,可读性更好(对于初学者到不见得),但由于递归需要系统堆栈,所以空间消耗要比非递归代码要大很 ...
- mac 下 sphinx + mysql + php 实现全文搜索(xampp)(1)
原理: 使用sphinx 中的indexer 生成索引数据 service/web 端 利用searched 调用索引数据 步骤: 下载 sphinx: 下载地址:http://sphinxsea ...
- LINQ to XML学习笔记
一.XML基础知识 1.XML:可扩展标记语言 Extensible Markup Language ,提供了一种保存数据的格式,数据可以通过这种格式很容易地在不同的应用程序之间实现共享. 2.使用X ...
- Android水平(横向)翻页列表,类似水平GridVIew
Android水平(横向)翻页列表,类似于水平方向的GridView,行列自定义,但要翻页切换,考虑加载性能,当Item数据很多时加载和翻页要流畅,翻页时要有动画效果,效果图如下: 实现方式: 1:翻 ...
- Technical diagrams for SharePoint 2013
sharepoint2013技术图表 http://technet.microsoft.com/zh-cn/library/cc263199.aspx SharePoint 2013 的可下载内容 h ...