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. 微信小程序开发(二)创建小程序

    安装完“微信Web开发者工具”后,手机扫描二维码进入页面. 点击“添加项目”,填入之前获得的AppID(无AppID可忽略),输入项目名称“Hello WXapplet”,选定本地文件夹作为项目目录. ...

  2. HDU 2319 Card Trick (模拟)

    题目链接 Problem Description The magician shuffles a small pack of cards, holds it face down and perform ...

  3. JS window.name跨域封装

    JS window.name 跨域封装 function CrossDomainName(target, agent, callback, security) { if (typeof target ...

  4. 删除none的images

    脚本 #!/bin/bash docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker stop docker p ...

  5. 【Python学习】request库

    Requests库(https://www.python-requests.org/)是一个擅长处理那些复杂的HTTP请求.cookie.header(响应头和请求头)等内容的Python第三方库. ...

  6. Linux CentOS 6.9(图形界面)安装中文输入法

    安装步骤 1. 切换到 root 用户,执行 yum -y install "@Chinese Support" 2. 退出终端,选择桌面菜单中 "System" ...

  7. juery获取元素的方法

    1 从集合中通过指定的序号获取元素 html: 复制代码 代码如下: <div> <p>0</p> <p>1</p> <p>2& ...

  8. POJ - Problem 2282 - The Counting Problem

    整体思路:对于每一位,先将当前未达到$limit$部分的段 [如 $0$ ~ $10000$] 直接处理好,到下一位时再处理达到$limit$的部分. · $1 × 10 ^ n$以内每个数(包括$0 ...

  9. eclipse maven jetty启动修改默认端口

    如何修改eclipse中的maven项目jetty服务器的默认端口那?网上有很多办法,但配置上都没有效果,最后找到了简单.简洁的解决办法,就是在eclipse的jetty启动命令后面加上以下内容 je ...

  10. javaScript如何跳出多重循环break、continue

    先来说说break和continue之间的区别 for(var i=0;i<10;i++){  if(i>5){  break;  }}console.log(i);  ---6  •当i ...