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. java对象与json互转

    package com.liveyc; import java.io.StringWriter; import org.junit.Test; import com.fasterxml.jackson ...

  2. 【洛谷 P4166】 [SCOI2007]最大土地面积(凸包,旋转卡壳)

    题目链接 又调了我两个多小时巨亏 直接\(O(n^4)\)枚举4个点显然不行. 数据范围提示我们需要一个\(O(n^2)\)的算法. 于是\(O(n^2)\)枚举对角线,然后在这两个点两边各找一个点使 ...

  3. Impala笔记之通用命令

    help help命令用于查询其它命令的用法 [quickstart.cloudera:21000] > help select; Executes a SELECT... query, fet ...

  4. Knockout双向绑定

    knockout双工绑定基于 observe 模式,性能高.核心就是observable对象的定义.这个函数最后返回了一个也叫做 observable 的函数,也就是用户定义值的读写器(accesso ...

  5. java使用simpleDateFormat格式化日期 时间

    时间日期标识符: yyyy:年 MM:月 dd:日 hh:1~12小时制(1-12) HH:24小时制(0-23) mm:分 ss:秒 S:毫秒 E:星期几 D:一年中的第几天 F:一月中的第几个星期 ...

  6. 基于Node的Web聊天室

    1 项目名称 Web聊天室(<这是NodeJs实战>第二章的一个案例,把整个开发过程记录下来)

  7. Shell-history命令加记录用户IP

    记录输入的命令 history命令可以查看用户输入过的命令,一个典型history命令输出如下: 980 2017-05-29 20:17:37 cd - 981 2017-05-29 20:17:4 ...

  8. __inet_insert_ifa/__inet_del_ifa

    /* 添加ip地址 主地址添加到最后一个满足范围的主地址后面 从地址添加到整个列表后面 若列表中存在与插入地址在同一子网的地址,则 要求ip地址不同且范围相同,并且插入地址认为是从地址 */ stat ...

  9. UVA题解三

    UVA题解三 UVA 127 题目描述:\(52\)张扑克牌排成一列,如果一张牌的花色或者数字与左边第一列的最上面的牌相同,则将这张牌移到左边第一列的最上面,如果一张牌的花色或者数字与左边第三列的最上 ...

  10. Eclipse java项目转换为web项目

    1.打开.project文件,并修改文件, 修改如下: 找到:<natures> </natures>代码段,在代码段中加入如下内容并保存: <nature>org ...