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. 【CodeForces】960 F. Pathwalks 主席树+动态规划

    [题目]F. Pathwalks [题意]给定n个点m条边的有向图,可能不连通有重边有自环.每条边有编号 i 和边权 wi ,求最长的路径(可以经过重复节点)满足编号和边权都严格递增.n,m,wi&l ...

  2. ES6核心,值得驻足花一天时间来学习

    1.let 和 const 命令 在es5时,只有两种变量声明,var 和function.在es6中新增了四种let和const,以及另外两种声明import和class. 我们先讲解let和con ...

  3. Java读取大文件的高效率实现

    1.概述 本教程将演示如何用Java高效地读取大文件.这篇文章是Baeldung (http://www.baeldung.com/) 上“Java——回归基础”系列教程的一部分. 2.在内存中读取 ...

  4. NYOJ 141 Squares (数学)

    题目链接 描述 A square is a 4-sided polygon whose sides have equal length and adjacent sides form 90-degre ...

  5. sublime格式化css代码插件:css format

    有时会从网上下载一些css压缩文件,打开后所有代码都在一行,不利于阅读,通过css format插件,能快速展开代码,方便阅读. 参考:Sublime Text 上最好用的 CSS 格式化插件 —— ...

  6. spring boot 自定义属性覆盖application文件属性

    参考 Spring boot源码分析-ApplicationListener应用环境: https://blog.csdn.net/jamet/article/details/78042486 加载a ...

  7. Postgres中tuple的组装与插入

    1.相关的数据类型 我们先看相关的数据类型: HeapTupleData(src/include/access/htup.h) typedef struct HeapTupleData { uint3 ...

  8. sqlite3使用简介

    sqlite3使用简介 一.使用流程 要使用sqlite,需要从sqlite官网下载到三个文件,分别为sqlite3.lib,sqlite3.dll,sqlite3.h,然后再在自己的工程中配置好头文 ...

  9. 安装Https证书

    安装证书 IIS 6 支持PFX格式证书,下载包中包含PFX格式证书和密码文件.以沃通证书为例: 文件说明: 1. 证书文件214083006430955.pem,包含两段内容,请不要删除任何一段内容 ...

  10. 2017 ACM ICPC Asia Regional - Daejeon

    2017 ACM ICPC Asia Regional - Daejeon Problem A Broadcast Stations 题目描述:给出一棵树,每一个点有一个辐射距离\(p_i\)(待确定 ...