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 ...
随机推荐
- 【BZOJ3687】简单题 背包+bitset
[BZOJ3687]简单题 Description 小呆开始研究集合论了,他提出了关于一个数集四个问题:1.子集的异或和的算术和.2.子集的异或和的异或和.3.子集的算术和的算术和.4.子集的算术和的 ...
- EasyNVR depends on ffmpeg,yasm/nasm not found or too old. Use --disable-yasm for a crippledbuild
安装ffmpeg过程中,执行./configure时,报yasm/nasm not found or too old. Use --disable-yasm for a crippledbuild错误 ...
- 20160924-2——mysql常见问题集锦
一.数据类型相关问题 1.varchar(N)占用多少空间 (1)varchar(N)里的N是字符数,而不是字节数: (2)字符类型(varchar text blob等)空间=字符实际长度+字段长度 ...
- (转)使用ServiceStack构建Web服务
提到构建WebService服务,大家肯定第一个想到的是使用WCF,因为简单快捷嘛.首先要说明的是,本人对WCF不太了解,但是想快速建立一个WebService,于是看到了MSDN上的这一篇文章 Bu ...
- python基础26 -----python进程及协成
一.进程 1.multiprocessing模块实现多进程并发. 1.1multiprocessing包是Python中的多进程管理包,与threading.Thread类似,它可以利用multipr ...
- Python之函数总结
一,函数的定义与调用 定义:def 关键词开头,空格之后接函数名称和圆括号(),最后还有一个":". def 是固定的,不能变,必须是连续的def三个字母,不能分开 def 函数名 ...
- 函数没有返回值,默认返回undefined
var a =( function(){return})(); a = undefined;
- JQuery 获取父元素方法
---恢复内容开始--- <tr class="removerow" style=""> <td> <input type=&qu ...
- win32调试——OutputDebugString
win32下开发console程序可以直接用printf打印到控制台. 开发图形界面程序时,可以调用OutputDebugString将字符串输出到Debug窗口, 注意是要调试运行才能看到Debug ...
- 树莓派连接DHT11温湿度传感器(python)
介绍 DHT11作为一个廉价配件,同时包含了温度.湿度传感器,而且,编码使用也非常简单. 本文介绍如果在树莓派中使用 DHT11,代码是Python.如果有任何疑问,欢迎在下面留言. 接线 VCC接5 ...