洛谷.3391.文艺平衡树(fhq Traep)
//注意反转时先分裂r,因为l,r是针对整棵树的排名
#include<cstdio>
#include<cctype>
#include<algorithm>
//#define gc() getchar()
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
const int N=1e5+7,MAXIN=2e6;
int n,root,sz[N],son[N][2],fix[N],tag[N];
char IN[MAXIN],*SS=IN,*TT=IN;
inline int read()
{
int now=0,f=1;register char c=gc();
for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now*f;
}
inline void Update(int rt)
{
sz[rt]=sz[son[rt][0]]+sz[son[rt][1]]+1;
}
inline void Down(int rt)
{
tag[son[rt][0]]^=1,
tag[son[rt][1]]^=1;
std::swap(son[rt][0],son[rt][1]);
tag[rt]=0;//清空!
}
int Build(int l,int r)
{
if(l>r) return 0;
int m=l+r>>1;
fix[m]=rand(),sz[m]=1;
son[m][0]=Build(l,m-1),
son[m][1]=Build(m+1,r);
Update(m);
return m;
}
void Split(int rt,int k,int &x,int &y)
{
if(!rt) x=y=0;
else
{
if(tag[rt]) Down(rt);
if(k<=sz[son[rt][0]]) y=rt,Split(son[rt][0],k,x,son[rt][0]);
else x=rt,Split(son[rt][1],k-sz[son[rt][0]]-1,son[rt][1],y);
Update(rt);
}
}
int Merge(int x,int y)
{
if(!x||!y) return x+y;
if(tag[x]) Down(x);
if(tag[y]) Down(y);
if(fix[x]<fix[y])
{
son[x][1]=Merge(son[x][1],y);
Update(x);
return x;
}
else
{
son[y][0]=Merge(x,son[y][0]);
Update(y);
return y;
}
}
void Reverse()
{
int x,y,z,l=read(),r=read();
Split(root,r+1,y,z), Split(y,l,x,y);
tag[y]^=1;
root=Merge(Merge(x,y),z);
}
void DFS(int rt)
{
if(tag[rt]) Down(rt);
if(son[rt][0]) DFS(son[rt][0]);
if(rt!=1&&rt!=n+2) printf("%d ",rt-1);
if(son[rt][1]) DFS(son[rt][1]);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("3391.in","r",stdin);
#endif
n=read();
root=Build(1,n+2);
int q=read();
while(q--) Reverse();
DFS(root);
return 0;
}
洛谷.3391.文艺平衡树(fhq Traep)的更多相关文章
- [洛谷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 文艺平衡树
题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是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模板)
模板题. 注意标记即可,另外,涉及区间翻转操作,记得设立首尾哨兵. 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int ...
- BZOJ3224/洛谷P3391 - 普通平衡树(Splay)
BZOJ链接 洛谷链接 题意简述 模板题啦~ 代码 //普通平衡树(Splay) #include <cstdio> int const N=1e5+10; int rt,ndCnt; i ...
- 洛谷P3369普通平衡树(Treap)
题目传送门 转载自https://www.cnblogs.com/fengzhiyuan/articles/7994428.html,转载请注明出处 Treap 简介 Treap 是一种二叉查找树.它 ...
- P3391 【模板】文艺平衡树FHQ treap
P3391 [模板]文艺平衡树(Splay) 题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转 ...
- 洛谷.3391.[模板]文艺平衡树(Splay)
题目链接 //注意建树 #include<cstdio> #include<algorithm> const int N=1e5+5; //using std::swap; i ...
随机推荐
- MFC创建线程示例
MFC创建线程示例 AfxBeginThread() 创建现场的方法是AfxBeginThread()函数. 在[.CPP]文件定义一个全局变量,决定什么时候退出这个线程. BOOL g_bWillE ...
- 命令查看WebSphere MQ运行状态
参考:https://wenku.baidu.com/view/34e40e2ffd0a79563c1e72b9.html 一.查看队列管理器运行状态 # dspmq 显示结果中QMNAME表示MQ队 ...
- C# 发送email邮件!
利用C#邮件发送邮箱使用到两个类SmtpClient和MailMessage.可以把SmtpClient看做发送邮件信息的客户端,而把MailMessage看做需要发送的消息. 下面是我写的发送邮件的 ...
- HDU 5288 OO’s Sequence
题意: 给你一个序列, 有一个函数 F(L,R) 其中 ai 均不能 被 aL - aR整除的 函数值是这个ai个数 思路 : 反过来求 满足这样的条件的 ai 的区间,然后求和 #include& ...
- SKlearn库学习曲线
思想: # 1.现将所有样本用交叉验证方法或者(随机抽样方法) 得到 K对 训练集-验证集# 2.依次对K个训练集,拿出数量不断增加的子集如m个,并在这些K*m个子集上训练模型.# 3.依次在对应训练 ...
- C <string.h>常用函数介绍
1. strcpychar *strcpy(char *destin, char *source);功能:将source指向的字符串拷到destin. int main() { ]; "; ...
- webpack 4.0.0-beta.0 新特性介绍
webpack 可以看做是模块打包机.它做的事情是:分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript等),并将其打包为合适的格式 ...
- 并发之AQS原理(一) 原理介绍简单使用
并发之AQS原理(一) 如果说每一个同步的工具各有各的强大,那么这个强大背后是一个相同的动力,它就是AQS. AQS是什么 AQS是指java.util.concurrent.locks包里的Abst ...
- java util Aarrys 类
toString方法 产生一维数组的二维版本 public static String toString(type[] a) { //type 是传入数据类型 if (a == null) retu ...
- jquery----数据增删改
简单版本 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...