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 平衡树的更多相关文章

  1. Luogu P3391 【模板】文艺平衡树 Splay 平衡树

    https://www.luogu.org/problemnew/show/P3391 以前写过题解的入门题重写练板子.wdnmd真就 ' == ' 写成 ' = ' 了编译器不报错呗. #inclu ...

  2. luoguP3391[模板]文艺平衡树(Splay) 题解

    链接一下题目:luoguP3391[模板]文艺平衡树(Splay) 平衡树解析 这里的Splay维护的显然不再是权值排序 现在按照的是序列中的编号排序(不过在这道题目里面就是权值诶...) 那么,继续 ...

  3. 【阶梯报告】洛谷P3391【模板】文艺平衡树 splay

    [阶梯报告]洛谷P3391[模板]文艺平衡树 splay 题目链接在这里[链接](https://www.luogu.org/problemnew/show/P3391)最近在学习splay,终于做对 ...

  4. 文艺平衡树 Splay 学习笔记(1)

    (这里是Splay基础操作,reserve什么的会在下一篇里面讲) 好久之前就说要学Splay了,结果苟到现在才学习. 可能是最近良心发现自己实在太弱了,听数学又听不懂只好多学点不要脑子的数据结构. ...

  5. Splay平衡树入门小结

    学习到这部分算是数据结构比较难的部分了,平衡树不好理解代码量大,但在某些情况下确实是不可替代的,所以还是非学不可. 建议先学Treap之后在学Splay,因为其实Splay有不少操作和Treap差不多 ...

  6. hiho #1329 : 平衡树·Splay

    #1329 : 平衡树·Splay 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,上一次你跟我讲了Treap,我也实现了.但是我遇到了一个关键的问题. ...

  7. 【BZOJ3224】Tyvj 1728 普通平衡树 Splay

    Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数 ...

  8. BZOJ3224/洛谷P3391 - 普通平衡树(Splay)

    BZOJ链接 洛谷链接 题意简述 模板题啦~ 代码 //普通平衡树(Splay) #include <cstdio> int const N=1e5+10; int rt,ndCnt; i ...

  9. Hihocoder 1329 平衡树·Splay(平衡树)

    Hihocoder 1329 平衡树·Splay(平衡树) Description 小Ho:小Hi,上一次你跟我讲了Treap,我也实现了.但是我遇到了一个关键的问题. 小Hi:怎么了? 小Ho:小H ...

随机推荐

  1. NYOJ 129 树的判定 (并查集)

    题目链接 描述 A tree is a well-known data structure that is either empty (null, void, nothing) or is a set ...

  2. VueJS 轻松支持 JSX 配置

    使用: babel-preset-vue-app TODO

  3. 日常开发技巧:x11-forward,使用远程机器的gui程序

    背景 日常用过ssh登录服务器进行工作,尽管大部分时间,都只需要终端操作,编辑源码也是vim就够用了. 但有时候,还是需要使用gui程序的,比如打开一份pdf,word,ppt,excel等. 碰到这 ...

  4. 在shell中如何判断字符串是否为有效的IP地址【转】

    转自 在shell中如何判断字符串是否为有效的IP地址_echoisecho_新浪博客http://blog.sina.com.cn/s/blog_53a844e50100xxus.html 近来需要 ...

  5. Codeforces Round #455 (Div. 2)

    Codeforces Round #455 (Div. 2) A. Generate Login 题目描述:给出两个字符串,分别取字符串的某个前缀,使得两个前缀连起来的字符串的字典序在所有方案中最小, ...

  6. 对 makefile 中 .DEFAULT 的理解

    上例子: all:gao @echo "final".DEFAULT: @echo "In default" 由于 gao 是一个前提条件,但是 makefil ...

  7. DHCP简单配置

    DHCP是什么? DHCP动态主机地址管理协议(Dynamic Host Configuration Protocol)是一种基于UDP协议且仅限用于局域网内使用的网络协议,最主要的用途是为局域网内部 ...

  8. java基础14 多态(及关键字:instanceof)

    面向对象的三大特征: 1.封装   (将一类属性封装起来,并提供set()和get()方法给其他对象设置和获取值.或者是将一个运算方法封装起来,其他对象需要此种做运算时,给此对象调用) 2.继承   ...

  9. python_异常处理

    常用异常种类 AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x IOError 输入/输出异常:基本上是无法打开文件 ImportError 无法引入模块 ...

  10. Codeforces 822C Hacker, pack your bags!(思维)

    题目大意:给你n个旅券,上面有开始时间l,结束时间r,和花费cost,要求选择两张时间不相交的旅券时间长度相加为x,且要求花费最少. 解题思路:看了大佬的才会写!其实和之前Codeforces 776 ...