题目背景

这是一道经典的Splay模板题——文艺平衡树。

题目描述

您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1

输入输出格式

输入格式:

第一行为n,m(n,m<=100000) n表示初始序列有n个数,这个序列依次是(1,2, \cdots n-1,n)(1,2,⋯n−1,n) m表示翻转操作次数

接下来m行每行两个数 [l,r][l,r] 数据保证 1 \leq l \leq r \leq n1≤l≤r≤n

输出格式:

输出一行n个数字,表示原始序列经过m次变换后的结果

输入输出样例

输入样例

5 3
1 3
1 3
1 4

输出样例

4 3 2 1 5

splay模板题,维护该序列的中序遍历不变,然后每次通过旋转节点使操作的区间变作一颗字树,然后打上标记即可。什么是splay?一棵伸展树......什么是伸展树?最近刚学,我个人的理解,大概就是一个能在不破坏二叉搜索树结构(即中序遍历始终为升序)的情况下通过旋转一个节点到他根节点位置使得操作区间恰好全部位于一棵子树内的方法。

然后就打上标记,之后在类似线段树一样的pushdown传递信息就好了。

代码如下:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define mod
#define mid (R+L>>1)
#define M 2000010
using namespace std;
LL read(){LL nm=0,oe=1;char cw=getchar();while(!isdigit(cw)) oe=cw=='-'?-oe:oe,cw=getchar();while(isdigit(cw)) nm=nm*10+(cw-'0'),cw=getchar();return nm*oe;
}
LL n,m,l[M],r[M],tp[M],ad,sz[M],tg[M],ace,a,b,p,q,cnt;
bool flag=false;
void pushdown(LL x){if(tg[x]==0) return;tg[x]=0,swap(l[x],r[x]);tg[l[x]]^=1,tg[r[x]]^=1;
}
void pushup(LL x){sz[x]=sz[l[x]]+sz[r[x]]+1;}
LL build(LL L,LL R,LL rt){if(L>R) return 0;tp[mid]=rt,sz[mid]=1;if(L==R) return L;l[mid]=build(L,mid-1,mid);r[mid]=build(mid+1,R,mid);sz[mid]+=sz[l[mid]]+sz[r[mid]];return mid;
}
void rotate(LL x){if(ace==x) return;LL top=tp[x];pushdown(top),pushdown(x);if(top==ace) ace=x,tp[x]=n+1,tp[top]=x;else{if(l[tp[top]]==top) l[tp[top]]=x;else r[tp[top]]=x;tp[x]=tp[top],tp[top]=x;}if(l[top]==x) l[top]=r[x],tp[r[x]]=top,r[x]=top;else r[top]=l[x],tp[l[x]]=top,l[x]=top;pushup(top),pushup(x);
}
void oper(LL x){if(x==ace||tp[x]==ace){return;}LL top=tp[x];pushdown(top);if(tp[top]==ace) rotate(x);else if(l[l[tp[top]]]==x||r[r[tp[top]]]==x) rotate(top);else rotate(x);
}
LL find(LL x,LL pos){pushdown(x);if(sz[l[x]]==pos-1) return x;if(sz[l[x]]<pos-1) return find(r[x],pos-sz[l[x]]-1);else return find(l[x],pos);
}
void ans(LL x){if(x==0) return;pushdown(x);ans(l[x]);if(x<n&&x>1){if(flag) printf(" ");flag=true;printf("%lld",x-1);}ans(r[x]);
}
int main(){n=read()+2,m=read(),ace=build(1,n,n+1);while(m--){a=read(),b=read();p=find(ace,a),q=find(ace,b+2);while(tp[q]!=ace&&q!=ace) oper(q);if(q!=ace) rotate(q);while(tp[p]!=ace) oper(p);tg[r[p]]^=1;}ans(ace);return 0;
}

我这里还是写的比较模糊,我也是通过了解别人的博客才理解了splay

就是这个 -> http://blog.csdn.net/skydec/article/details/20151805

转载于:https://www.cnblogs.com/OYJason/p/7887057.html

洛谷 P3391 【模板】文艺平衡树相关推荐

  1. [洛谷P3391] 文艺平衡树 (Splay模板)

    初识splay 学splay有一段时间了,一直没写...... 本题是splay模板题,维护一个1~n的序列,支持区间翻转(比如1 2 3 4 5 6变成1 2 3 6 5 4),最后输出结果序列. ...

  2. 浅尝无旋Treap (基于洛谷P3391 文艺平衡树)

    说是浅尝吧,确实也挺浅的,完全是基于下面这道题写的↓ 洛谷P3391 自己去看题,我是懒得粘了... 分析 其实也没有什么好分析的,这就是一道Splay树的模板题,解决一般的Treap不能解决的区间维 ...

  3. 洛谷P3391文艺平衡树(Splay)

    题目传送门 转载自https://www.cnblogs.com/yousiki/p/6147455.html,转载请注明出处 经典引文 空间效率:O(n) 时间效率:O(log n)插入.查找.删除 ...

  4. 洛谷 P3391 文艺平衡树

    题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 --b ...

  5. 专题·树链剖分【including 洛谷·【模板】树链剖分

    初见安~~~终于学会了树剖~~~ [兴奋]当初机房的大佬在学树剖的时候我反复强调过:"学树剖没有前途的!!!" 恩.真香. 一.重链与重儿子 所谓树剖--树链剖分,就是赋予一个链的 ...

  6. 洛谷·【模板】点分树 | 震波【including 点分树

    初见安-这里是传送门:洛谷P6329 [模板]点分树 | 震波 一.点分树 其实你会点分治的话,点分树就是把点分治时的重心提出来重新连城一棵树. 比如当前点是u,求出子树v的重心root后将root与 ...

  7. 洛谷 - P3391 【模板】文艺平衡树(Splay-区间反转)

    题目链接:点击查看 题目大意:给出一个初始时 a[ i ] = i 的序列,给出 m 次操作,每次操作将区间 [ l , r ] 内的数列反转,问最终的数列是什么 题目分析:Splay处理区间反转问题 ...

  8. [洛谷P3391]文艺平衡树

    题目 传送门 to luogu 思路 题外话:一开始用Splay\text{Splay}Splay写了一发,结果-- 然后就换成了Treap\text{Treap}Treap.嗯,无旋Treap\te ...

  9. 洛谷.3919.[模板]可持久化数组(可持久化线段树/平衡树)

    题目链接 //利用先前的根节点建树 想一下不难写. #include <cstdio> #include <cctype> //#define gc() getchar() # ...

最新文章

  1. java实现进程管理,Java调用批处理或可执行文件和Runtime、Process类实现Java版进程管理器...
  2. Spring+SpringMVC项目搭建
  3. Android Linux内核编译调试
  4. python命名空间特性_Python命名空间与作用域
  5. docker kubernetes--
  6. 王者齐聚!Unite 2017 Shanghai 日程讲师全揭晓
  7. 字符去多余空格_【Excel技巧】批量去空格删换行,用这两个函数简单又快速
  8. 【译文练习】ReactiveCocoa概要:了解和使用RACCommand
  9. LeetCode 58 Spiral Matrix II
  10. 一年翻 3 倍,装机量 6 亿台的物联网操作系统又放大招!
  11. |NOIOJ|动态规划|8462:大盗阿福
  12. 关于Maven构建的项目依赖范围
  13. 软件测试复盘思路个人总结
  14. VR沙盘 日夜场景的制作(Unity2018)
  15. 空间平面方程的三种表述方式
  16. 外卖扫码点餐独立全开源小程序源码+VUE前端
  17. 手机怎么压缩图片?分享一下压缩的好方法
  18. 当图片被压缩时,图片变得模糊
  19. 森林图怎么分析_资料|用Stata怎么做Meta分析?看完你就懂啦
  20. http协议中get和post的基本区别,tcp/ip协议的三次握手

热门文章

  1. windows10中的Ubuntu
  2. 【Transformer】PoolFormer: MetaFormer is Actually What You Need for Vision
  3. 单词嵌入_单词嵌入与单词袋:推荐系统的奇怪案例
  4. pca 主成分分析_六分钟的主成分分析(PCA)的直观说明。
  5. 神经网络优化器的选择_神经网络:优化器选择的重要性
  6. 欢迎使用CSDN-markdown编辑器12213123
  7. 个人贷款5级分类,来看看你是哪一级
  8. c++怎么输入带有空格的字符串_杭电OJ 字符串处理类部分题解
  9. python将csv文件导入mysql-使用python将csv文件导入Mysql数据库
  10. linux的apache安装在哪个目录,在linux系统下apache的默认安装路径在哪