JZYZOJ1998 [bzoj3223] 文艺平衡树 splay 平衡树
http://172.20.6.3/Problem_Show.asp?id=1998
平衡树区间翻转的板子,重新写一遍,给自己码一个板子。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
using namespace std;
const int maxn=;
int c[maxn][],fa[maxn],siz[maxn],rev[maxn];
int n,m,rt;
inline int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x*=;x+=ch-'';ch=getchar();}
return x*f;
}
inline void pushup(int x){//向上总结siz
siz[x]=siz[c[x][]]+siz[c[x][]]+;
}
inline void pushdown(int x){//向下传递rev标记
if(rev[x]){
swap(c[x][],c[x][]);
rev[c[x][]]^=;rev[c[x][]]^=;
rev[x]=;
}
}
void build(int l,int r,int pa){//不完全二分建树。。
if(l>r)return;
if(l==r){
fa[l]=pa;siz[l]=;
if(l<pa)c[pa][]=l;
else c[pa][]=l;
return;
}
int mid=(l+r)/;
build(l,mid-,mid);build(mid+,r,mid);
if(mid<pa)c[pa][]=mid;
else c[pa][]=mid;
fa[mid]=pa;
pushup(mid);
}
int find(int x,int rank){//二分查找排名为rank的数
//因为建树的时候已经默认查找的数在数组中的序号就是它本身
//操作不会改变一个节点的序号,只会改变点和点的联系,从而改变排列顺序
pushdown(x);
//find中的pushdown相当于为后面的splay“开路”
int l=c[x][],r=c[x][];
if(siz[l]+==rank)return x;
else if(siz[l]>=rank)return find(l,rank);
else return find(r,rank-siz[l]-);
}
void rotate(int x,int &k){//向上旋转
int pa=fa[x];int gpa=fa[pa],l,r;
if(c[pa][]==x) l=;
else l=; r=l^;//上旋前x在pa的l方向
if(pa==k) k=x;
else{
//如果x旋转不到k,需要关注上旋后和gpa的儿子关系
//观察后面的调用,旋转到k时gpa的儿子关系相当于直接被继承,
if(c[gpa][]==pa)c[gpa][]=x;
else c[gpa][]=x;
}
fa[x]=gpa;fa[pa]=x;fa[c[x][r]]=pa;
c[pa][l]=c[x][r];c[x][r]=pa;
pushup(x);pushup(pa); }
void splay(int x,int &k){
while(x!=k){
int pa=fa[x];int gpa=fa[pa];
if(pa!=k){//这里的异或处理了顺位和逆位两种情况
/*顺位先将pa上旋至k,逆位直接将x向上旋,
避免树失衡。*/
if((c[pa][]==x)^(c[gpa][]==pa))rotate(x,k);
else rotate(pa,k);
}rotate(x,k);
}
}
void rever(int l,int r){
int x=find(rt,l),y=find(rt,r+);//找到两个数的位置
splay(x,rt);splay(y,c[x][]);//将两个数调为根和其rc
//此时,两个数之间的数都在根的rc的lc上
/* 我们开始开始的建树从1到n+2就是为了将1和n+2作为边界
事实上进行操作的是2到n+1这n个数。我们最后取的时候要减1。
所以,翻转l+1到r+1即可。
*/
rev[c[y][]]^=;
}
int main(){
n=read();m=read();
int x,y;
build(,n+,);rt=(n+)/;
for(int i=;i<=m;i++){
x=read();y=read();
rever(x,y);
}
for(int i=;i<=n+;i++){
printf("%d ",find(rt,i)-);
}
return ;
}
JZYZOJ1998 [bzoj3223] 文艺平衡树 splay 平衡树的更多相关文章
- Luogu P3391 【模板】文艺平衡树 Splay 平衡树
https://www.luogu.org/problemnew/show/P3391 以前写过题解的入门题重写练板子.wdnmd真就 ' == ' 写成 ' = ' 了编译器不报错呗. #inclu ...
- luoguP3391[模板]文艺平衡树(Splay) 题解
链接一下题目:luoguP3391[模板]文艺平衡树(Splay) 平衡树解析 这里的Splay维护的显然不再是权值排序 现在按照的是序列中的编号排序(不过在这道题目里面就是权值诶...) 那么,继续 ...
- 【阶梯报告】洛谷P3391【模板】文艺平衡树 splay
[阶梯报告]洛谷P3391[模板]文艺平衡树 splay 题目链接在这里[链接](https://www.luogu.org/problemnew/show/P3391)最近在学习splay,终于做对 ...
- 文艺平衡树 Splay 学习笔记(1)
(这里是Splay基础操作,reserve什么的会在下一篇里面讲) 好久之前就说要学Splay了,结果苟到现在才学习. 可能是最近良心发现自己实在太弱了,听数学又听不懂只好多学点不要脑子的数据结构. ...
- Splay平衡树入门小结
学习到这部分算是数据结构比较难的部分了,平衡树不好理解代码量大,但在某些情况下确实是不可替代的,所以还是非学不可. 建议先学Treap之后在学Splay,因为其实Splay有不少操作和Treap差不多 ...
- hiho #1329 : 平衡树·Splay
#1329 : 平衡树·Splay 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,上一次你跟我讲了Treap,我也实现了.但是我遇到了一个关键的问题. ...
- 【BZOJ3224】Tyvj 1728 普通平衡树 Splay
Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数 ...
- BZOJ3224/洛谷P3391 - 普通平衡树(Splay)
BZOJ链接 洛谷链接 题意简述 模板题啦~ 代码 //普通平衡树(Splay) #include <cstdio> int const N=1e5+10; int rt,ndCnt; i ...
- Hihocoder 1329 平衡树·Splay(平衡树)
Hihocoder 1329 平衡树·Splay(平衡树) Description 小Ho:小Hi,上一次你跟我讲了Treap,我也实现了.但是我遇到了一个关键的问题. 小Hi:怎么了? 小Ho:小H ...
随机推荐
- 20155117 王震宇 2006-2007-2 《Java程序设计》第三周学习总结
20155117 王震宇 2006-2007-2 <Java程序设计>第三周学习总结 教材学习内容总结 在JAVA程序编写中,常常要用到对象(Object),要产生对象首先要定义类(Cla ...
- Shader -> Photoshop图层混合模式计算公式大全
Photoshop图层混合模式计算公式大全 混合模式可以将两个图层的色彩值紧密结合在一起,从而创造出大量的效果,在这些效果的背后实际是一些简单的数学公式在起作用. 下面是photoshop cs2中所 ...
- Verilog笔记.6.FIFO
FIFO,First In First Out ,是一种先进先出的数据缓存器. 没有外部读写地址线,只能顺序写入数据,顺序的读出数据, 其数据地址由内部读写指针自动加1完成. 不能像普通存储器那样可以 ...
- Python标准库笔记(5) — sched模块
事件调度 sched模块内容很简单,只定义了一个类.它用来最为一个通用的事件调度模块. class sched.scheduler(timefunc, delayfunc)这个类定义了调度事件的通用接 ...
- MySQL源码分析(一)
近段时间简单看了下Mysql源码相关内容,主要从一个select查询出发,查看了一下整个代码结构.分析总结如下: https://mubu.com/doc/explore/13965
- linux常用命令一些解释
ls 命令是linux下最常用的命令.ls命令就是list的缩写缺省下ls用来打印出当前目录的清单如果ls指定其他目录那么就会显示指定目录里的文 件及文件夹清单. 通过ls 命令不仅可以查看li ...
- 20165301 2017-2018-2 《Java程序设计》第四周学习总结
20165301 2017-2018-2 <Java程序设计>第四周学习总结 教材学习内容总结 第五章:子类与继承 一个类只能有一个父类,但是可以有若干个子类. 子类的继承性 子类和父类在 ...
- 8. Docker Machine
- python datetime 时区(timezone) dateutil
记录下python中的时区问题, 代码如下: 包括datetime.datetime对象使用不同的时区,以及在不同时区间转换. from datetime import datetime from ...
- php面向对象中public与var的区别
public和var的作用差不多 因为 var定义的变量如果没有加protected 或 private则默认为public php4 中一般是用 varphp5 中就一般是用 public了 现在基 ...