此为平衡树系列第二道:文艺平衡树您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作:

翻转一个区间,例如原有序序列是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

非旋转treap相比于旋转treap支持区间操作,所以对于这道题只需要每次把树拆成[1~l-1]、[l~r]、[r+1~tot]三段,然后把[l~r]打上标记进行翻转,再把三段区间合并就行了。对于打标记的点只有在查到这个点时才翻转,如果一个点被打了两次标记就相当于不翻转。

最后附上代码.

指针版

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
char *p1,*p2,buf[100000];
#define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
int rd() {int x=0,f=1; char c=nc(); while(!isdigit(c)) {if(c=='-') f=-1; c=nc();} while(isdigit(c)) x=(((x<<2)+x)<<1)+(c^48),c=nc(); return x*f;}
ll rd2() {ll x=0,f=1; char c=nc(); while(!isdigit(c)) {if(c=='-') f=-1; c=nc();} while(isdigit(c)) x=(((x<<2)+x)<<1)+(c^48),c=nc(); return x*f;}
int n,m;
int L,R;
struct treap
{
int size;
int rnd;
int val;
int rev;
treap *ls,*rs;
treap(){}
treap(int k,treap *son)
{
size=1;
rnd=rand();
val=k;
ls=rs=son;
rev=0;
}
void pushup()
{
size=ls->size+rs->size+1;
}
void pushdown()
{
if(rev)
{
rev^=1;
ls->rev^=1;
rs->rev^=1;
swap(ls,rs);
}
}
}tr[100010],nil;
typedef treap* node;
node root,cnt,null;
void init()
{
nil=treap(0,NULL);
null=&nil;
null->ls=null->rs=null;
null->size=0;
root=null;
cnt=tr;
}
node build(int x)
{
*cnt=treap(x,null);
return cnt++;
}
node merge(node x,node y)
{
if(x==null)
{
return y;
}
if(y==null)
{
return x;
}
x->pushdown();
y->pushdown();
if(x->rnd<y->rnd)
{
x->rs=merge(x->rs,y);
x->pushup();
return x;
}
else
{
y->ls=merge(x,y->ls);
y->pushup();
return y;
}
}
void split(node rt,node &x,node &y,int k)
{
if(rt==null)
{
x=y=null;
return ;
}
rt->pushdown();
if(rt->ls->size>=k)
{
y=rt;
split(rt->ls,x,y->ls,k);
rt->pushup();
}
else
{
x=rt;
split(rt->rs,x->rs,y,k-rt->ls->size-1);
rt->pushup();
}
}
void print(node rt)
{
rt->pushdown();
if(rt->ls!=null)
{
print(rt->ls);
}
printf("%d",rt->val);
if(--n!=0)
{
printf(" ");
}
if(rt->rs!=null)
{
print(rt->rs);
}
}
node build_tree(int l,int r)
{
if(l==r)
{
return build(l);
}
int mid=(l+r)>>1;
return merge(build_tree(l,mid),build_tree(mid+1,r));
}
int main()
{
init();
n=rd();
m=rd();
root=build_tree(1,n);
while(m--)
{
L=rd();
R=rd();
node x,y,z;
split(root,y,z,R);
split(y,x,y,L-1);
y->rev^=1;
root=merge(merge(x,y),z);
}
print(root);
}

非指针版

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<cstring>
using namespace std;
int n,m;
int r[100010];
int v[100010];
int s[100010][3];
int size[100010];
bool d[100010];
int root;
int tot;
int L,R;
int x,y,z;
int flag;
void pushup(int x)
{
size[x]=size[s[x][0]]+size[s[x][1]]+1;
}
int build(int x)
{
v[++tot]=x;
r[tot]=rand();
size[tot]=1;
return tot;
}
void pushdown(int x)
{
swap(s[x][0],s[x][1]);
if(s[x][0])
{
d[s[x][0]]^=1;
}
if(s[x][1])
{
d[s[x][1]]^=1;
}
d[x]=0;
}
int merge(int x,int y)
{
if(!x||!y)
{
return x+y;
}
if(r[x]<r[y])
{
if(d[x])
{
pushdown(x);
}
s[x][1]=merge(s[x][1],y);
pushup(x);
return x;
}
else
{
if(d[y])
{
pushdown(y);
}
s[y][0]=merge(x,s[y][0]);
pushup(y);
return y;
}
}
void split(int i,int k,int &x,int &y)
{
if(!i)
{
x=y=0;
return ;
}
if(d[i])
{
pushdown(i);
}
if(size[s[i][0]]<k)
{
x=i;
split(s[i][1],k-size[s[i][0]]-1,s[i][1],y);
}
else
{
y=i;
split(s[i][0],k,x,s[i][0]);
}
pushup(i);
}
void print(int x)
{
if(!x)
{
return ;
}
if(d[x])
{
pushdown(x);
}
print(s[x][0]);
if(flag==0)
{
printf("%d",v[x]);
flag=1;
}
else
{
printf(" %d",v[x]);
}
print(s[x][1]);
}
int main()
{
srand(12378);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
root=merge(root,build(i));
}
for(int i=1;i<=m;i++)
{
scanf("%d%d",&L,&R);
split(root,L-1,x,y);
split(y,R-L+1,y,z);
d[y]^=1;
root=merge(merge(x,y),z);
}
print(root);
return 0;
}

BZOJ3223文艺平衡树——非旋转treap的更多相关文章

  1. BZOJ3224普通平衡树——非旋转treap

    题目: 此为平衡树系列第一道:普通平衡树您需要写一种数据结构,来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数, ...

  2. 4923: [Lydsy1706月赛]K小值查询 平衡树 非旋转Treap

    国际惯例的题面:这种维护排序序列,严格大于的进行操作的题都很套路......我们按照[0,k],(k,2k],(2k,inf)分类讨论一下就好.显然第一个区间的不会变化,第二个区间的会被平移进第一个区 ...

  3. [BZOJ3223]文艺平衡树 无旋Treap

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Description 您需要写一种数据结构(可参考题目标题),来维护一个 ...

  4. 平衡树及笛卡尔树讲解(旋转treap,非旋转treap,splay,替罪羊树及可持久化)

    在刷了许多道平衡树的题之后,对平衡树有了较为深入的理解,在这里和大家分享一下,希望对大家学习平衡树能有帮助. 平衡树有好多种,比如treap,splay,红黑树,STL中的set.在这里只介绍几种常用 ...

  5. BZOJ3729Gty的游戏——阶梯博弈+巴什博弈+非旋转treap(平衡树动态维护dfs序)

    题目描述 某一天gty在与他的妹子玩游戏.妹子提出一个游戏,给定一棵有根树,每个节点有一些石子,每次可以将不多于L的石子移动到父节点,询问将某个节点的子树中的石子移动到这个节点先手是否有必胜策略.gt ...

  6. 【bzoj3224】Tyvj 1728 普通平衡树 01Trie姿势+平衡树的四种姿势 :splay,旋转Treap,非旋转Treap,替罪羊树

    直接上代码 正所谓 人傻自带大常数 平衡树的几种姿势:  AVL Red&Black_Tree 码量爆炸,不常用:SBT 出于各种原因,不常用. 常用: Treap 旋转 基于旋转操作和随机数 ...

  7. [bzoj3196][Tyvj1730]二逼平衡树_树套树_位置线段树套非旋转Treap/树状数组套主席树/权值线段树套位置线段树

    二逼平衡树 bzoj-3196 Tyvj-1730 题目大意:请写出一个维护序列的数据结构支持:查询给定权值排名:查询区间k小值:单点修改:查询区间内定值前驱:查询区间内定值后继. 注释:$1\le ...

  8. 非旋转Treap:用运行时间换调试时间的有效手段

    非旋转Treap:用运行时间换调试时间的有效手段   Hello大家好,我们今天来聊一聊非旋转Treap. 相信各位或多或少都做过些序列上的问题.如果水题我们考虑暴力:不强制在线我们可能用过莫队和待修 ...

  9. 非旋转 treap

    其实之前学过一次非旋转 treap,但是全忘光了,今天复习一下. 洛谷 P3369 [模板]普通平衡树 code: #include <bits/stdc++.h> #define N 1 ...

随机推荐

  1. 深入理解Java虚拟机(类文件结构+类加载机制+字节码执行引擎)

    目录 1.类文件结构 1.1 Class类文件结构 1.2 魔数与Class文件的版本 1.3 常量池 1.4 访问标志 1.5 类索引.父索引与接口索引集合 1.6 字段表集合 1.7 方法集合 1 ...

  2. APM实践目录

    长路漫漫,如果不能作出一款可用开源的东西出来,那是对时光的浪费.   这是我的学习分布式调用链的实践之路! 思考大纲: .Net架构篇:思考如何设计一款实用的分布式监控系统? 理论篇: http:// ...

  3. ASP.Net Core2.1中的HttpClientFactory系列一:HttpClient的缺陷

    引言: ASP.NET Core2.1 中出现了一个新的 HttpClientFactory 功能, 它有助于解决开发人员在使用 HttpClient 实例从其应用程序中访问外部 web 资源时可能遇 ...

  4. docker安装并修改Nginx镜像

    1.安装nginx镜像,命令:docker pull nginx 2.创建nginx容器,并启动,命令:docker run --name webserver -d -p 192.168.51.227 ...

  5. Sparse Principal Component Analysis

    目录 背景: 部分符号 创新点 文章梗概 The LASSO AND THE ELASTIC NET 将PCA改造为回归问题 定理二 单个向量(无需进行SVD版本) 定理三 多个向量(无需进行SVD, ...

  6. CF892.B. Wrath

    ---恢复内容开始--- 题意: 有n个犯人,手上都有个长度为Li的武器,当铃响时大家同时挥动武器,只能把前面攻击范围内的敌人杀死,问最后还剩几个人. 题目传送门: [http://codeforce ...

  7. JoinPoint

    “JoinPoint对象封装了SpringAop中切面方法的信息,在切面方法中添加JoinPoint参数,就可以获取到封装了该方法信息的JoinPoint对象. ” JoinPoint适用于注解和Sc ...

  8. 福州大学软件工程1816 | W班 第3次作业成绩排名

    写在前面 汇总成绩排名链接 1.作业链接 第三次作业--原型设计(结对第一次) 2.评分准则 本次作业总分 25分,由以下部分组成: (1)在随笔开头请加上该博客链接,以方便阅读时查看作业需求,并备注 ...

  9. haoop笔记

    : //:什么是hadoop? hadoop是解决大数据问题的一整套技术方案 :hadoop的组成? 核心框架 分布式文件系统 分布式计算框架 分布式资源分配框架 hadoop对象存储 机器计算 :h ...

  10. MySQL中关于数据类型指定宽度之后的情况

    概述 MySQL有很多种数据类型,最常用的就是int,char,varchar,这些类型在创建表的时候都可以指定该字段的宽度,方法是在类型后面加一个括号,括号中写宽度就可以了. 但是,在指定宽度之后, ...