题目背景

这是一道经典的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次变换后的结果

输入输出样例

输入样例#1:

5 3
1 3
1 3
1 4
输出样例#1:

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的更多相关文章

  1. 洛谷 P3391 【模板】文艺平衡树(Splay)

    题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1, ...

  2. 【阶梯报告】洛谷P3391【模板】文艺平衡树 splay

    [阶梯报告]洛谷P3391[模板]文艺平衡树 splay 题目链接在这里[链接](https://www.luogu.org/problemnew/show/P3391)最近在学习splay,终于做对 ...

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

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

  4. BZOJ3223/洛谷P3391 - 文艺平衡树

    BZOJ链接 洛谷链接 题意 模板题啦~2 代码 //文艺平衡树 #include <cstdio> #include <algorithm> using namespace ...

  5. BZOJ3224/洛谷P3391 - 普通平衡树(Splay)

    BZOJ链接 洛谷链接 题意简述 模板题啦~ 代码 //普通平衡树(Splay) #include <cstdio> int const N=1e5+10; int rt,ndCnt; i ...

  6. 洛谷 P3391 文艺平衡树

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

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

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

  8. 洛谷 - P3391 【模板】文艺平衡树(Splay) - 无旋Treap

    https://www.luogu.org/problem/P3391 使用无旋Treap维护序列,注意的是按顺序插入的序列,所以Insert实际上简化成直接root和Merge合并,但是假如要在序列 ...

  9. 洛谷 P3391 【模板】文艺平衡树

    题目背景 这是一道经典的Splay模板题--文艺平衡树. 题目描述 您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4 ...

  10. 洛谷 P3391【模板】文艺平衡树(Splay)

    题目背景 这是一道经典的Splay模板题--文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1, ...

随机推荐

  1. hibernate连接数据库中文乱码

    4.做完这两步还是不行,需要修改hibernate的配置文件hibernate.cfg.xml,在配置文件配置hibernate.connection.url属性.示例: <property n ...

  2. Linux腾讯云下安装mysql

    百度云盘下载地址https://pan.baidu.com/s/1MqUEdeqZuQbq-veLuVItQQ 将下载好的mysql-5.7.14-linux-glibc2.5-x86_64.tar. ...

  3. Axis2开发webservice详解

    Axis2开发webservice详解 标签: javawebserviceAxis2 2015-08-10 10:58 1827人阅读 评论(0) 收藏 举报  分类: JAVA(275)  服务器 ...

  4. 简单的xml数据库设计

    我的需求 有时候系统需要存储一些简单的关系型属性,不考虑并发,不考虑性能(一次操作在几ms),数据库没有其他依赖引用,拿过来就可以用 为什么选xml作为数据库? 可读性好 实体的对应关系不严格 , 二 ...

  5. 风炫安全web安全学习第二十八节课 CSRF攻击原理

    风炫安全web安全学习第二十八节课 CSRF攻击原理 CSRF 简介 跨站请求伪造 (Cross-Site Request Forgery, CSRF),也被称为 One Click Attack 或 ...

  6. Let's Encrypt SSL证书申请

    当前环境: 阿里云CoreOS 所绑定的域名,解析管理也在阿里这儿,在该文档中使用 example.com 作为示例. Docker 镜像 acme.sh:2.8.8 nginx 申请证书并使用 使用 ...

  7. 设计模式之委派模式(Delegate Pattern)深入浅出

    学习目标:精简程序逻辑,提升代码的可读性. 内容定位:希望通过对委派模式的学习,让自己写出更加优雅的代码的人群. 委派模式定义: 委派模式(Delegate Pattern)的基本作用是负责任务的调度 ...

  8. 双重校验锁 --使用volatile和两次判空校验

    介绍 双重校验锁是单例模式中,饿汉式的一种实现方式.因为有两次判空校验,所以叫双重校验锁,一次是在同步代码块外,一次是在同步代码块内. 为什么在同步代码块内还要再检验一次? 第一个if减少性能开销,第 ...

  9. 安卓手机使用Termux及搭建FTP服务器

    Termux安装配置设置参见: 国光:Termux高级终端使用配置教程 搭建FTP服务器参见: Termux安装使用FTP服务器

  10. 分贝单位的本质(下半篇),dBm、dBFS、dBV的妙处你想象不到

    上半篇讲到了声音分贝的概念, 对于声音的单位:dB SPL和dB SIL,有兴趣了解并推算的朋友,可以点击以下链接(PC端效果更佳) http://www.sengpielaudio.com/calc ...