BZOJ3223文艺平衡树——非旋转treap

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

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

转载于:https://www.cnblogs.com/Khada-Jhin/p/9090646.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/570816.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux centOS 硬盘分区挂载

文章转载自&#xff1a;http://linux008.blog.51cto.com/2837805/548711 1、什么是分区&#xff1f; 分区是将一个硬盘驱动器分成若干个逻辑驱动器&#xff0c;分区是把硬盘连续的区块当做一个独立的磁硬使用。分区表是一个硬盘分区的索引,分区的信息都会写进分区表。 2、为…

Ambari删除服务报错之CSRF protection is turned on

Ambari安装组件失败后执行 curl 删除服务报错 CSRF protection is turned on X-Requested_By HTTP Header is required 解决方案&#xff1a; vi /etc/ambari-server/conf/ambari-properties增加 api.csrfPrevention.enabledfalse重启Ambari: ambari-server restart重新执行s…

Android 中.aar文件生成方法与用法

https://i.cnblogs.com/EditPosts.aspx?opt1 无论是用Eclipse还是用Android Studio做android开发&#xff0c;都会接触到jar包&#xff0c;全称应该是&#xff1a;Java Archive&#xff0c;即java归档文件。在用AS的过程中&#xff0c;你会发现有aar这么个东西&#xff0c;经查…

Ambari实现HTTPS登陆

关于Ambari的安全、访问控制在这里有非常详细的介绍。 http://pivotalhd.docs.pivotal.io/docs/security-guide-ambari-2.1.2.html 另外还可以参考这一篇 https://community.hortonworks.com/articles/39865/enabling-https-for-ambariserver-and-troubleshootin.html Amba…

ffs, fls

linux内核中的宏ffs(x) linux内核中ffs(x)宏是平台相关的宏,在arm平台,该宏定义在 arch/arm/include/asm/bitops.h #define ffs(x) ({ unsigned long __t (x); fls(__t & -__t); }) __t & -__t 等于找到__t 第一个为1的位(从低位开始),并把该位保留为1其余位清0. 例…

PLSQL注册码

Product Code: 4t46t6vydkvsxekkvf3fjnpzy5wbuhphqz serial Number: 601769 password: xs374ca

【JAVA学习】09.创建BootstrapTale列表页

【提要】只要JSON 返回了rows , total ,数据就会展示在列表 【步骤】 1、页面添加Table标签用于装载数据 <table class"table" id"userTable"> <tr><td>请输入查询条件查询</td></tr>   </table> 2、页面初始化请求…

安装ElasticSearch过程遇到的坑

采用默认安装时是可以成功安装的&#xff0c;但是只能在本机通过127.0.0.1:9200访问&#xff0c;修改: network.host: 为本机IP后&#xff0c;启动报错。 elasticsearch 5.3 安装过程中遇到了一些问题&#xff0c;这里简单记录一下 。 问题一&#xff1a;警告提示 [2016-11-…

JS的介绍

1.JS是什么 &#xff1f; JS是一门脚本语言&#xff0c;是一门解释性语言&#xff0c;是一种动态类型的语言&#xff0c;是一门基于对象的语言。 脚本语言和和编译语言的区别&#xff1a;脚本语言不需要编译&#xff0c;直接执行。编译语言是需要把代码翻译成计算机所认识的二进…

windows10上安装mysql

环境&#xff1a;windwos 10&#xff08;1511&#xff09; 64bit、mysql 5.7.14 一、下载mysql1. 在浏览器里打开mysql的官网http://www.mysql.com/2. 进入页面顶部的"Downloads"3. 打开页面底部的“Community(GPL) Downloads” 4. 在页面中间的位置找到我们windows上…

后台长期运行进程的三种方式

入门&#xff1a; nohup command > /var/log/test.log 2>&1 & 优雅&#xff1a; screen方式&#xff0c;通过screen 命令创建的环境下运行的终端命令&#xff0c;其父进程不是sshd 登陆会话&#xff0c;而是screen,这样就可以避免用户退出进程消失的问题&…

sql server 内存初探

sql server 内存初探 原文:sql server 内存初探一. 前言 对于sql server 这个产品来说&#xff0c;内存这块是最重要的一个资源&#xff0c; 当我们新建一个会话&#xff0c;相同的sql语句查询第二次查询时间往往会比第一次快&#xff0c;特别是在sql统计或大量查询数据输出时&…

hdfs查看目录大小文件大小

1、hadoop fs -du /test 查看test子目录大小 2、hadoop fs -count -q /test

使用TcpClient的例程

例子1&#xff1a; ///假定一切工作正常 ///连接后发送一次消息&#xff0c;然后不停接受消息并且打印 主要API说明 TcpClient clientnew TcpClient(); client.Connect("127.0.0.1",8888); NetworkStream streamclient.GetStream(); 发送&#xff1a; stream.Write(o…

Hawq超过最大允许连接数

Hawq默认master允许最大连接数250 segment最大连接数750 可以通过命令行或者Ambari更改连接数 1、 命令行 $ hawq config -c max_connections -v 1000 $ hawq config -c seg_max_connections -v 2000 $ hawq config -c max_prepared_transactions -v 1000 更改完成后&…

Mac原生解决ntfs格式只能读不能写

如何打开Mac OSX原生的读写NTFS功能&#xff08;支持OS X EI&#xff0c;秒杀NTFS&#xff09; 最近OS X EI更新成风&#xff0c;本人的是2014年初的macbookair&#xff0c;双系统&#xff0c;OSWIN&#xff08;仅仅用于工作需要的2个软件&#xff0c;装个bootcamp双系统稳定扎…

web api 权限控制

https://www.cnblogs.com/landeanfen/p/5287064.html 我只是个搬运工&#xff0c; 我只想存个档转载于:https://www.cnblogs.com/LoveAndPeace/p/9105037.html

Hadoop 跨集群复制文件

hadoop distcp -pbc hdfs://namenode1/test hdfs://namenode2/test 如果报用户权限写入被拒绝&#xff0c;切换到hdfs

20172324 2017-2018-2《程序设计与数据结构》实验三报告

20172324 2017-2018-2《程序设计与数据结构》实验三报告 课程&#xff1a;《程序设计与数据结构》 班级&#xff1a; 1723 姓名&#xff1a; 曾程 学号&#xff1a;20172324 实验教师&#xff1a;王志强 实验日期&#xff1a;2018年5月23日 必修/选修&#xff1a; 必修 一、实验…

Hive:hive is not allowed to impersonate anonymous

1、用kettle通过jdbc连接hiveserver2的时候抛出异常 Exception in thread "main" org.apache.hive.service.cli.HiveSQLException: Failed to open new session: java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.au…