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) ...
随机推荐
- mysql日期时间操作
select curdate(); --获取当前日期 select last_day(curdate()); --获取当月最后一天. select DATE_ADD(curdate(),interva ...
- JS中的!=、== 、!==、===的用法和区别。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 var num = 1; var str = '1'; var test = 1; t ...
- redis使用watch完成秒杀抢购功能:
redis使用watch完成秒杀抢购功能: 使用redis中两个key完成秒杀抢购功能,mywatchkey用于存储抢购数量和mywatchlist用户存储抢购列表. 它的优点如下: 1. 首先选用内 ...
- 统计某一字段等于不同值的个数的sql语句(分享)
本文介绍下,用一条sql语句统计某一字段等于不同值的个数,方法很独特,有需要的朋友参考下. 表t,数据: id type001 1001 0002 1001 ...
- Spark Tungsten揭秘 Day4 内存和CPU优化使用
Spark Tungsten揭秘 Day4 内存和CPU优化使用 今天聚焦于内存和CPU的优化使用,这是Spark2.0提供的关于执行时的非常大的优化部分. 对过去的代码研究,我们会发现,抽象的提高, ...
- Spark机器学习 Day1 机器学习概述
Spark机器学习 Day1 机器学习概述 今天主要讨论个问题:Spark机器学习的本质是什么,其内部构成到底是什么. 简单来说,机器学习是数据+算法. 数据 在Spark中做机器学习,肯定有数据来源 ...
- python 判断 windows 隐藏文件/系统文件
linux 下隐藏文件是以句号 “.” 开头的文件,根据文件名即可判断是否为隐藏文件. win 下是以文件隐藏属性确定的,所以,只能通过微软的 API 获取隐藏属性来判断是否为隐藏文件. 1. win ...
- Linux下mail/mailx命令发送邮件
最近看到项目中经常会用mail/mailx命令发送由java程序生成的report,比较新鲜.下面就简单介绍下mail/mailx命令用法.本文以mail命令举例(mail/mailx)效果都是一样的 ...
- win 7 64位如何安装erdas 9.2
最主要的就是crack包必须包含这三个文件:erdas.exe、license.dat和lmgrd.exe 将这三个文件都复制到C盘安装目录下bin中,其余安装同win 7 32位系统
- 【BZOJ2199】 [Usaco2011 Jan]奶牛议会
Description 由于对Farmer John的领导感到极其不悦,奶牛们退出了农场,组建了奶牛议会.议会以“每头牛 都可以获得自己想要的”为原则,建立了下面的投票系统: M只到场的奶牛 (1 & ...