BZOJ3223 文艺平衡树(splay)
题目背景
这是一道经典的Splay模板题——文艺平衡树。
题目描述
您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1
输入输出格式
输入格式:
第一行为n,m n表示初始序列有n个数,这个序列依次是 (1,2, \cdots n-1,n)(1,2,⋯n−1,n) m表示翻转操作次数
接下来m行每行两个数 [l,r][l,r] 数据保证 1 \leq l \leq r \leq n 1≤l≤r≤n
输出格式:
输出一行n个数字,表示原始序列经过m次变换后的结果
输入输出样例
输入样例#1:
5 3
1 3
1 3
1 4
输出样例#1: 
4 3 2 1 5
题解:打标记的splay!调了一个上午终于调出来了!继续挖坑~
代码如下:
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 100010
using namespace std; struct Splay
{
int key[N],son[N][],size[N],fa[N],tag[N],rt,sz,pos;
inline void push_up(int x)
{
size[x]=size[son[x][]]+size[son[x][]]+;
}
inline void push_down(int x)
{
if(!tag[x])
{
return;
}
tag[x]=;
tag[son[x][]]^=;
tag[son[x][]]^=;
swap(son[x][],son[x][]);
}
inline void rotate(int x)
{
int y=fa[x],z=fa[y],k=(son[y][]==x);
son[z][son[z][]==y]=x;
fa[x]=z;
son[y][!k]=son[x][k];
fa[son[x][k]]=y;
son[x][k]=y;
fa[y]=x;
push_up(y);
}
inline void splay(int x,int goal)
{
for(push_down(x); fa[x]!=goal; rotate(x))
{
int y=fa[x],z=fa[y];
if(z!=goal)
{
(son[y][]==x)^(son[z][]==y)?rotate(x):rotate(y);
}
}
push_up(x);
if(!goal)
{
rt=x;
}
}
inline int kth(int k)
{
for(int x=rt;;)
{
push_down(x);
int y=son[x][];
if(k>size[y]+)
{
k-=size[y]+;
x=son[x][];
}
else
{
if(k>size[y])
{
return x;
}
else
{
x=y;
}
}
}
}
inline void reverse(int l,int r)
{
if(l>r)
{
swap(l,r);
}
int x=kth(l),y=kth(r+);
splay(x,);
splay(y,x);
tag[son[y][]]^=;
}
inline int build(int *a,int father,int l,int r)
{
if(l>r)
{
return ;
}
int mid=(l+r)>>,x=++sz;
fa[x]=father;
key[x]=a[mid];
son[x][]=build(a,x,l,mid-);
son[x][]=build(a,x,mid+,r);
push_up(x);
return x;
}
inline void put(int x)
{
push_down(x);
if(son[x][])
{
put(son[x][]);
}
if(key[x]>-1e9&&key[x]<1e9)
{
printf("%d ",key[x]);
}
if(son[x][])
{
put(son[x][]);
}
}
} splay1; int main()
{
int n,m,l,r,a[]; scanf("%d%d",&n,&m);
for(int i=; i<=n+; i++)
{
a[i]=i-;
}
a[]=-1e9;
a[n+]=1e9;
splay1.rt=splay1.build(a,,,n+);
for(int i=; i<=m; i++)
{
scanf("%d%d",&l,&r);
splay1.reverse(l,r);
}
splay1.put(splay1.rt);
}
BZOJ3223 文艺平衡树(splay)的更多相关文章
- JZYZOJ1998 [bzoj3223] 文艺平衡树 splay 平衡树
		
http://172.20.6.3/Problem_Show.asp?id=1998 平衡树区间翻转的板子,重新写一遍,给自己码一个板子. #include<iostream> #incl ...
 - [bzoj3223]文艺平衡树(splay区间反转模板)
		
解题关键:splay模板题. #include<cstdio> #include<cstring> #include<algorithm> #include< ...
 - [bzoj3223]文艺平衡树——splay
		
题意 你应当编写一个数据结构,支持以下操作: 反转一个区间 题解 我们把在数组中的位置当作权值,这样原序列就在这种权值意义下有序,我们考虑使用splay维护. 对于操作rev[l,r],我们首先把l- ...
 - 【阶梯报告】洛谷P3391【模板】文艺平衡树 splay
		
[阶梯报告]洛谷P3391[模板]文艺平衡树 splay 题目链接在这里[链接](https://www.luogu.org/problemnew/show/P3391)最近在学习splay,终于做对 ...
 - luoguP3391[模板]文艺平衡树(Splay)  题解
		
链接一下题目:luoguP3391[模板]文艺平衡树(Splay) 平衡树解析 这里的Splay维护的显然不再是权值排序 现在按照的是序列中的编号排序(不过在这道题目里面就是权值诶...) 那么,继续 ...
 - BZOJ3223: Tyvj 1729 文艺平衡树 [splay]
		
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3595 Solved: 2029[Submit][Sta ...
 - bzoj3223 文艺平衡树 (treap or splay分裂+合并)
		
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 3313 Solved: 1883 [Submit][S ...
 - Tyvj  P1729 文艺平衡树  Splay
		
题目: http://tyvj.cn/p/1729 P1729 文艺平衡树 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 此为平衡树系列第二道:文艺平衡树 ...
 - BZOJ 3223: Tyvj 1729 文艺平衡树(splay)
		
速度居然进前十了...第八... splay, 区间翻转,用一个类似线段树的lazy标记表示是否翻转 ------------------------------------------------- ...
 
随机推荐
- 批量修改文件名后缀,例如:html修改成HTML
			
批量修改文件名后缀,例html修改成HTML 把文件后缀名html全部修改成HTML: 例:aa.html aa.HTML #!/bin/bash for file in `ls`;do mv $fi ...
 - mysql枚举类型与集合类型
			
枚举类型与集合类型 字段的值只能在给定范围中选择,如单选框,多选框 enum 单选 只能在给定的范围内选一个值,如性别 sex 男male/女female set 多选 在给定的范围内可以选择一个或一 ...
 - 【phonegap】用本地浏览器打开网页
			
<a id="ssl2" href="#" onclick="openLocalExplorer()">请点击跳到页面</ ...
 - 2014.9.30 Double转字符
			
(57.0/60.0).ToString("f2")="0.95" 等于 string.Format("{0:F2}",57.0/60)=& ...
 - ubuntu双网卡准备配置
			
近日有个需求,交换机有两台,做了堆叠,服务器双网卡,每个分别连到一台交换机上.这样就需要将服务器的网卡做成主备模式,以增加安全性,使得当其中一个交换机不通的时候网卡能够自动切换. 整体配置不难,网上也 ...
 - 让你的javascript代码高大上
			
1,创造简短的写法 你可以这么写: var slice = Array.prototype.slice; slice.call(arguments); //转化成数组 也可以这么写:(ie9+) va ...
 - component to string 自定义窗体
			
component to string string to component StringToComponent ComponentToString ObjectTextToBinary Objec ...
 - 监控和安全运维  1.8 zabbix服务端安装
			
1. Zabbix简介基于web的开源软件,开源监控系统状态也可以监控网络设备.和nagios不同的是zabbix会把获取的数据保存在数据库中,所以zabbix需要有数据库支持 Zabbix还可以自动 ...
 - Android独立交叉编译环境搭建
			
我们经常需将一些C/C++源码编译成本地二进制,直接在android的linux内核上运行,这是就需要进行交叉编译.由于Android的运行环境核普通Linux又区别,所以常规方式针对ARM进行交叉编 ...
 - nand中间出现坏块,无法正常启动内…
			
我板子的启动过程如下: ..showlogo.. Flash: 1 MB NAND: SLC detected.256 MB In: serial Out: serial ...