P3391 文艺平衡树
hh
题目描述
您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是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
分析
不要问我为什么,我是抄的别人的代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<ctime>
using namespace std;
const int MAXN=;
static void read(int &n)
{
char c='+';int x=;bool flag=;
while(c<''||c>''){c=getchar();if(c=='-')flag=;}
while(c>=''&&c<=''){x=(x<<)+(x<<)+(c-);c=getchar();}
flag==?n=-x:n=x;
}
int ch[MAXN][];// 0左孩子 1右孩子
int val[MAXN];// 每一个点的权值
int pri[MAXN];// 随机生成的附件权值
int siz[MAXN];// 以i为节点的树的节点数量
int sz;// 总结点的数量
int n,m;
int x,y,z,a,b,root;
int mark[MAXN];
void update(int x)
{
siz[x]=+siz[ch[x][]]+siz[ch[x][]];
}
void pushdown(int x)
{
if(x&&mark[x])
{
mark[x]=;
swap(ch[x][],ch[x][]);
if(ch[x][]) mark[ch[x][]]^=;
if(ch[x][]) mark[ch[x][]]^=;
}
}
int new_node(int v)
{
siz[++sz]=;// 新开辟一个节点
val[sz]=v;
pri[sz]=rand();
return sz;
} int merge(int x,int y)// 合并
{
if(!x||!y) return x+y;// x和y中必定有一个是0
pushdown(x);pushdown(y);
if(pri[x]<pri[y])// 把x加到左边的树上
{
ch[x][]=merge(ch[x][],y);// 不懂的看GIF图
update(x);
return x;
}
else
{
ch[y][]=merge(x,ch[y][]);
update(y);
return y;
}
}
void split(int now,int k,int &x,int &y)
{
if(!now) x=y=;// 到达叶子节点
else
{
pushdown(now);
if (k<=siz[ch[now][]])
y=now,split(ch[now][],k,x,ch[now][]);
else
x=now,split(ch[now][],k-siz[ch[now][]]-,ch[now][],y);
update(now);
}
}
int build(int l,int r)
{
if(l>r) return ;
int mid=(l+r)>>;int v=mid-;
int now=new_node(v);
ch[now][]=build(l,mid-);
ch[now][]=build(mid+,r);
update(now);
//pushdown(now);
return now;
}
void dfs(int x)
{
if(!x) return ;
pushdown(x);
dfs(ch[x][]);
if(val[x]>=&&val[x]<=n)
printf("%d ",val[x]);
dfs(ch[x][]);
}
void res(int l,int r)
{
int a,b,c,d;
split(root,r+,a,b);
split(a,l,c,d);
mark[d]^=;
root=merge(merge(c,d),b);
}
int main()
{
srand((unsigned)time(NULL)); read(n);read(m);
root=build(,n+);
for(int i=;i<=m;i++)
{int l,r;read(l);read(r);res(l,r);}
dfs(root);
return ;
}
P3391 文艺平衡树的更多相关文章
- [luogu P3391] 文艺平衡树
[luogu 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 ...
- P3391 文艺平衡树(Splay)
题目背景 这是一道经典的Splay模板题--文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1, ...
- 洛谷 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)插入.查找.删除 ...
- Luogu P3391 文艺平衡树(Splay or FHQ Treap)
这道题要求区间反转...好东西.. 对于Splay:把l-1旋到根,把r+1旋到根的右儿子,这样r+1的左儿子就是整个区间了,然后对这个区间打个tg 注意要插-Inf和Inf到树里面,防止越界,坐标要 ...
- 【Luogu】P3391文艺平衡树(Splay)
题目链接 ddosvoid和自为风月马前卒教了我这道题 他们好强啊 如果我们要反转区间[l,r] 我们首先把l的前驱旋转到根节点 再把r的后继旋转到根节点的右儿子 那么此时根节点的右儿子的左儿子所代表 ...
- 【题解】P3391 文艺平衡树
用pb_ds库中的rope水过去的,忽然发现这玩意能水好多模拟题. 详见这个博客:背景的小姐姐真的好看 声明 #include <ext/rope> using namespace __g ...
随机推荐
- Instapaper 使用经验和技巧
Instapaper 分类本质是文件夹整理,没有标签. 文件夹意味着一篇文章只能放在一个文件夹里,不像标签可以实现一篇文章多个标签的功能. 一.文件夹和Like功能 1.已有文件夹: Home:存放所 ...
- 在执行save操作时候出现的诡异!
情景:有一份excel数据需要导入到数据库中,想了想就写了一个导入excel的小功能. .............................准备使用时候,就开搞了,擦! 什么鬼??? 全程无报错 ...
- <2013 08 12> Andrew:C语言的一点心得
C语言的特点在于,这是少见的中级语言(介于机器汇编和高级语言之间),因此它极其紧密地与特定机器架构.编译器.操作系统.库等基本概念相连.在底层,人们可以少量的甚至不使用汇编,但是不能不使用C.它以一种 ...
- vue禁止复制的方式
普通网页禁止复制的功能这里不再叙述,自行学习 https://blog.csdn.net/qq_32963841/article/details/84656752 这里简单写一下vue中怎么禁止使用复 ...
- JS获取短信验证码60秒
<script language="javascript"> function get_mobile_code(){ $.post("{{ ...
- ubuntu下MySQL无法启动Couldn't find MySQL server (/usr/bin/mysqld_safe)”
一台虚拟测试机,启动的时候,报上述错误,从这个报错来看,多半是因为读取到了另外的my.cnf导致的 那么,my.cnf放置在什么地方? 可以通过如下指令获取到 root@mysql:~# mysqld ...
- IDEA 跑spring项目找不到get,set的问题
@Autowired的用法和作用 这个注解就是spring可以自动帮你把bean里面引用的对象的setter/getter方法省略,它会自动帮你set/get. iDEA下安装lombok这个插件就可 ...
- AndroidStudio项目import进的包都是红色的
今天在开发项目时,一不留神,项目中import部分的内容全部变成了灰色,最后的类名却都变成了红色,如图: 一时之间,懵逼了~~~.Alt+Enter快捷键导包竟然是这个样子的@_@: 这简直就没见过 ...
- 《Python数据分析》笔记2——统计学与线性代数
统计学与线性代数 用Numpy进行简单的描述性统计计算 import numpy as np from scipy.stats import scoreatpercentile data=np.loa ...
- 3.3 使用STC89C52控制MC20通过GPRS远程发送数据
需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...