洛谷 p3391
题目背景
这是一道经典的Splay模板题——文艺平衡树。
题目描述
您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1
输入输出格式
输入格式:
第一行为n,m n表示初始序列有n个数,这个序列依次是(1,2,⋯n−1,n) m表示翻转操作次数
接下来m行每行两个数[l,r] 数据保证1≤l≤r≤n
输出格式:
输出一行n个数字,表示原始序列经过m次变换后的结果
输入输出样例
5 3
1 3
1 3
1 4
4 3 2 1 5
说明
n,m≤100000
_______________________________________________________________________
FHQ_TREAP:处理区间翻转问题
_______________________________________________________________________
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int maxn=1e5+10;
4 struct node
5 {
6 int ch[2],val,siz,rd;
7 bool rev;
8 }tr[maxn];
9 int root,cnt;
10 int newnode(int x)
11 {
12 ++cnt;
13 tr[cnt].val=x;
14 tr[cnt].siz=1;
15 tr[cnt].rd=rand();
16 tr[cnt].rev=0;
17 tr[cnt].ch[0]=tr[cnt].ch[1]=0;
18 return cnt;
19 }
20 void update(int x)
21 {
22 tr[x].siz=tr[tr[x].ch[0]].siz+tr[tr[x].ch[1]].siz+1;
23 }
24 void down(int x)
25 {
26 if(tr[x].rev)
27 {
28 if(tr[x].ch[0])tr[tr[x].ch[0]].rev^=1;
29 if(tr[x].ch[1])tr[tr[x].ch[1]].rev^=1;
30 swap(tr[x].ch[1],tr[x].ch[0]);
31 tr[x].rev=0;
32 }
33 }
34 int merge(int x,int y)
35 {
36 if(x*y==0)return x+y;
37 if(tr[x].rd<tr[y].rd)
38 {
39 if(tr[x].rev)down(x);
40 tr[x].ch[1]=merge(tr[x].ch[1],y);
41 update(x);
42 return x;
43 }
44 else
45 {
46 if(tr[y].rev)down(y);
47 tr[y].ch[0]=merge(x,tr[y].ch[0]);
48 update(y);
49 return y;
50 }
51 }
52 void split(int cur,int k,int &x,int &y)
53 {
54 if(!cur)x=y=0;
55 else
56 {
57 if(tr[cur].rev)down(cur);
58 if(tr[tr[cur].ch[0]].siz<k)
59 {
60 x=cur;
61 split(tr[cur].ch[1],k-tr[tr[cur].ch[0]].siz-1,tr[cur].ch[1],y);
62 }
63 else
64 {
65 y=cur;
66 split(tr[cur].ch[0],k,x,tr[cur].ch[0]);
67 }
68 update(cur);
69 }
70 }
71 void rever(int l,int r)
72 {
73 int x,y,z;
74 split(root,r,y,z);
75 split(y,l-1,x,y);
76 tr[y].rev^=1;
77 root=merge(merge(x,y),z);
78 }
79 void print(int cur)
80 {
81 if(!cur)return;
82 if(tr[cur].rev)down(cur);
83 print(tr[cur].ch[0]);
84 printf("%d ",tr[cur].val);
85 print(tr[cur].ch[1]);
86 }
87 int n,m;
88 int main()
89 {
90 scanf("%d%d",&n,&m);
91 for(int i=1;i<=n;++i)root=merge(root,newnode(i));
92 for(int l,r,i=0;i<m;++i)
93 {
94 scanf("%d%d",&l,&r);
95 rever(l,r);
96 }
97 print(root);
98 return 0;
99 }
洛谷 p3391的更多相关文章
- 洛谷 P3391 【模板】文艺平衡树(Splay)
题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1, ...
- 【阶梯报告】洛谷P3391【模板】文艺平衡树 splay
[阶梯报告]洛谷P3391[模板]文艺平衡树 splay 题目链接在这里[链接](https://www.luogu.org/problemnew/show/P3391)最近在学习splay,终于做对 ...
- [洛谷P3391] 文艺平衡树 (Splay模板)
初识splay 学splay有一段时间了,一直没写...... 本题是splay模板题,维护一个1~n的序列,支持区间翻转(比如1 2 3 4 5 6变成1 2 3 6 5 4),最后输出结果序列. ...
- BZOJ3223/洛谷P3391 - 文艺平衡树
BZOJ链接 洛谷链接 题意 模板题啦~2 代码 //文艺平衡树 #include <cstdio> #include <algorithm> using namespace ...
- BZOJ3224/洛谷P3391 - 普通平衡树(Splay)
BZOJ链接 洛谷链接 题意简述 模板题啦~ 代码 //普通平衡树(Splay) #include <cstdio> int const N=1e5+10; int rt,ndCnt; i ...
- 洛谷 P3391 文艺平衡树
题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 --b ...
- 洛谷P3391文艺平衡树(Splay)
题目传送门 转载自https://www.cnblogs.com/yousiki/p/6147455.html,转载请注明出处 经典引文 空间效率:O(n) 时间效率:O(log n)插入.查找.删除 ...
- 洛谷 - P3391 【模板】文艺平衡树(Splay) - 无旋Treap
https://www.luogu.org/problem/P3391 使用无旋Treap维护序列,注意的是按顺序插入的序列,所以Insert实际上简化成直接root和Merge合并,但是假如要在序列 ...
- 洛谷 P3391 【模板】文艺平衡树
题目背景 这是一道经典的Splay模板题--文艺平衡树. 题目描述 您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4 ...
- 洛谷 P3391【模板】文艺平衡树(Splay)
题目背景 这是一道经典的Splay模板题--文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1, ...
随机推荐
- 转载--对batch normalization的理解
转载的大神的: https://www.cnblogs.com/guoyaohua/p/8724433.html 上边这个应该是抄的下边这个原文,但是上边的有重点标记 https://blog.csd ...
- Spring IOC 笔记
什么是IOC与DI IOC(inversion of control) 它描述的其实是一种面向对象编程中的设计原则,用来降低代码之间的耦合度, 而DI(dependency Injection)依赖注 ...
- vue-element Form表单验证(表单验证没错却一直提示错误)
在使用element-UI 的表单时,发生一个验证错误,例如已输入值但求验证纠错: 代码如下所示: <el-form :model="correction" :i ...
- RocetMQ搭建攻略和问题解决之道
最近有在尝试给项目加入消息中间件服务,首先想到了鼎鼎大名的RocketMQ.RocketMQ是一款高性能的.分布式消息中间件,由阿里开源.它提供了丰富的消息拉取方式,能够处理上亿级的海量数据,甚至在阿 ...
- 容器编排系统K8s之NetworkPolicy资源
前文我们了解了k8s的网络插件flannel的基础工作逻辑,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14225657.html:今天我们来聊一下k8s上 ...
- C语言-表达式和运算符
表达式:表达式是c语言的主体,在c语言中,表达式由操作符和操作数组成.简单的表达式可以只有一个操作数.根据操作符的个数,可以将表达式分为简单表达式和复杂表达式,简单的表达式只含有一个操作符(如:5+5 ...
- Spring Boot 2.x基础教程:实现文件上传
文件上传的功能实现是我们做Web应用时候最为常见的应用场景,比如:实现头像的上传,Excel文件数据的导入等功能,都需要我们先实现文件的上传,然后再做图片的裁剪,excel数据的解析入库等后续操作. ...
- 洛谷P4848 崂山白花蛇草水 权值线段树+KDtree
题目描述 神犇 \(Aleph\) 在 \(SDOI\ Round2\) 前立了一个 \(flag\):如果进了省队,就现场直播喝崂山白花蛇草水.凭借着神犇 \(Aleph\) 的实力,他轻松地进了山 ...
- 当音乐学博士搞起编程,用一本书改变了Java世界!
前言 说到Spring,也许现在的开发者们最先想到的是 Josh Long 超快的语速与现场代码能力,让很多Java开发者折服. 然后Spring的历史上,最传奇的还是要数其创始人:Rod Johns ...
- Linux下Oracle 11G XE 安装笔记
操作系统 [oracle@RAC02 ~]$ lsb_release -aLSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:cor ...