洛谷 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, ...
随机推荐
- positive-unlabeled (PU) learning
PULearning的应用场景是,我们可以清晰地确定正样本,但是不能确定负样本,因为它有可能是正样本,只是我们还没有证明. 这时我们可以把这部分不确定的样本称为无标签样本U,加上正样本P来建立模型. ...
- SpringBoot异常处理(二)
参数校验机制 JSR-303 Hibernate 参数接收方式: URL路径中的参数 {id} (@PathVariable(name="id") int-whatever) UR ...
- 数据库分库分表容量划分建议参考阿里云DRDS原则
做分库分表的时候 一直想知道分库分表容量的最优规则有什么好的建议,以下是参考阿里云 DRDS 分库分表的规则,还是有一定的参考意义 .
- eclipse 4.4安装aptana插件
eclipse 4.4安装aptana插件: 1.地址: http://download.aptana.com/studio3/plugin/update/index.html.在线安装即可成功! 2 ...
- 推荐系统实践 0x13 Word2Vec
Word2Vec是谷歌团队提出的,让词向量在自然语言处理当中再度流行,并且推广到了广告.搜索.推荐等各个领域当中.Word2Vec顾名思义,就是一个生成对词的向量表达的模型.假设我们使用一组句子组成的 ...
- 坐标转换成SVG的path路径
大家好,我是一个刚入职的前端小白,入职后一直做关于svg 的东西,我将自以为很方便的方法提供给大家. function svgPathCurv(a,b,curv) { /* * 弯曲函数. * a:a ...
- ElasticSearch教程——filter与query对比(转学习使用)
一.数据准备 PUT /company/employee/2 { "address": { "country": "china", &quo ...
- 关于Webservice接口对接相关总结
Webservice接口对接 因为近期处理了很多关于Webservice的接口对接,所以这篇文章是对近期自己的学习做一个简单的总结. 一: 对于接口对接,建议首先需要了解一下WSDL文件,以及入参的S ...
- 在.NET Core中使用Channel(三)
到目前为止,我们一直在使用所谓的"Unbounded"通道.你会注意到,当我们创建通道时,我们这样做: var myChannel = Channel.CreateUnbounde ...
- Lesson_strange_words6
stylized 有艺术效果的 slide 幻灯片,滑动 template 模板,样板 grasp 掌握,领悟 factor 因素 twisted pair cable 双绞线 twisted 扭曲的 ...