洛谷 P3391 【模板】文艺平衡树

题目背景

这是一道经典的Splay模板题——文艺平衡树。

题目描述

您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1

输入输出格式

输入格式:

 

第一行为n,m(n,m<=100000) n表示初始序列有n个数,这个序列依次是(1,2, \cdots n-1,n)(1,2,n1,n) m表示翻转操作次数

接下来m行每行两个数 [l,r][l,r] 数据保证 1 \leq l \leq r \leq n1lrn

 

输出格式:

 

输出一行n个数字,表示原始序列经过m次变换后的结果

输入输出样例

输入样例
5 3
1 3
1 3
1 4
输出样例
4 3 2 1 5


splay模板题,维护该序列的中序遍历不变,然后每次通过旋转节点使操作的区间变作一颗字树,然后打上标记即可。
什么是splay?
一棵伸展树......
什么是伸展树?
最近刚学,我个人的理解,大概就是一个能在不破坏二叉搜索树结构(即中序遍历始终为升序)的情况下
通过旋转一个节点到他根节点位置使得操作区间恰好全部位于一棵子树内的方法。


然后就打上标记,之后在类似线段树一样的pushdown传递信息就好了。

代码如下:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define mod
#define mid (R+L>>1)
#define M 2000010
using namespace std;
LL read(){LL nm=0,oe=1;char cw=getchar();while(!isdigit(cw)) oe=cw=='-'?-oe:oe,cw=getchar();while(isdigit(cw)) nm=nm*10+(cw-'0'),cw=getchar();return nm*oe;
}
LL n,m,l[M],r[M],tp[M],ad,sz[M],tg[M],ace,a,b,p,q,cnt;
bool flag=false;
void pushdown(LL x){if(tg[x]==0) return;tg[x]=0,swap(l[x],r[x]);tg[l[x]]^=1,tg[r[x]]^=1;
}
void pushup(LL x){sz[x]=sz[l[x]]+sz[r[x]]+1;}
LL build(LL L,LL R,LL rt){if(L>R) return 0;tp[mid]=rt,sz[mid]=1;if(L==R) return L;l[mid]=build(L,mid-1,mid);r[mid]=build(mid+1,R,mid);sz[mid]+=sz[l[mid]]+sz[r[mid]];return mid;
}
void rotate(LL x){if(ace==x) return;LL top=tp[x];pushdown(top),pushdown(x);if(top==ace) ace=x,tp[x]=n+1,tp[top]=x;else{if(l[tp[top]]==top) l[tp[top]]=x;else r[tp[top]]=x;tp[x]=tp[top],tp[top]=x;}if(l[top]==x) l[top]=r[x],tp[r[x]]=top,r[x]=top;else r[top]=l[x],tp[l[x]]=top,l[x]=top;pushup(top),pushup(x);
}
void oper(LL x){if(x==ace||tp[x]==ace){return;}LL top=tp[x];pushdown(top);if(tp[top]==ace) rotate(x);else if(l[l[tp[top]]]==x||r[r[tp[top]]]==x) rotate(top);else rotate(x);
}
LL find(LL x,LL pos){pushdown(x);if(sz[l[x]]==pos-1) return x;if(sz[l[x]]<pos-1) return find(r[x],pos-sz[l[x]]-1);else return find(l[x],pos);
}
void ans(LL x){if(x==0) return;pushdown(x);ans(l[x]);if(x<n&&x>1){if(flag) printf(" ");flag=true;printf("%lld",x-1);}ans(r[x]);
}
int main(){n=read()+2,m=read(),ace=build(1,n,n+1);while(m--){a=read(),b=read();p=find(ace,a),q=find(ace,b+2);while(tp[q]!=ace&&q!=ace) oper(q);if(q!=ace) rotate(q);while(tp[p]!=ace) oper(p);tg[r[p]]^=1;}ans(ace);return 0;
}
 

我这里还是写的比较模糊,我也是通过了解别人的博客才理解了splay

就是这个 -> http://blog.csdn.net/skydec/article/details/20151805

转载于:https://www.cnblogs.com/OYJason/p/7887057.html

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

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

相关文章

CCD/CMOS靶面尺寸型号标准

传感器尺寸指的是感光器对角线尺寸&#xff0c;1/1.7英寸&#xff08;14.8毫米&#xff0d;&#xff0d;导向管尺寸&#xff09;大于1/2.3英寸&#xff08;10.95毫米&#xff0d;&#xff0d;&#xff0d;导向管尺寸&#xff09;.采用同种技术水平的感光器&#xff0c;肯定是单…

分布式学习基础知识

网络通讯&#xff0c;网络是分布式的基础&#xff0c;对分布式的理解建立在对网络的理解上&#xff0c;包括&#xff1a; OSI模型的7层TCP/IP&#xff0c;DNS&#xff0c;NATHTTP&#xff0c;SPDY/HTTP2Telnet网络编程&#xff0c;是通过程序在多个主机之间通信。包括&#xff…

django中FastDFS客户端与自定义文件存储系统

什么是FastDFSFastDFS 是用 c 语言编写的一款开源的分布式文件系统。FastDFS 为互联网量身定制&#xff0c; 充分考虑了冗余备份、负载均衡、线性扩容等机制&#xff0c;并注重高可用、高性能等指标&#xff0c;使用 FastDFS 很容易搭建一套高性能的文件服务器集群提供文件上传…

新近碰到的病毒(TR.Spy.Babonock.A)

先来段Microsoft的说明&#xff1a; Worm:Win32/Babonock.A Alert level: Severe Detected with Windows Defender Antivirus Also detected as:Worm/Win32.AutoIt (AhnLab)Trojan-Spy.Win32.AutoIt.p (Kaspersky)Worm/Autoit.ANVE (AVG)TR/Spy.Babonock.A (Avira)Win32/Autoit…

镜头基本参数

非常好的文章 &#xff0c;下载不了&#xff0c;但是会经常阅读。 https://wenku.baidu.com/view/47a7deddee06eff9aff8074e.html?rec_flagdefault&sxts1529650964474

Linux课程笔记 Day09 课上内容总结 MySql,Php的安装及Apache,Nginx,Php的优化

一 MySql 1.1 如何选择MySql的版本 1.2 MySql单实例安装 &#xff08;1&#xff09; 建立mysql用户 首先以root身份登陆到linux系统&#xff0c;然后执行如下命令创建mysql用户及用户组 [roottest3 ~]# groupadd mysql [roottest3 ~]# useradd -s /sbin/nologin -g …

jenkins 通过自动拉取Gitlab上的代码实现自动更新NGINX

所需要用到的环境&#xff1a; Gitlab&#xff1a; 172.20.7.70Jenkins&#xff1a; 172.20.7.71nginx&#xff1a; 172.20.7.72 gitlab 和Jenkins安装自行百度 开始实验操作 首先通过网页访问nginx&#xff0c;nginx默认测试页我是改了的 &#xff0c;所以看到的不是它原…

Kylin工作原理、体系架构

核心思想&#xff1a;预计算。 对多维分析可能用到的度量进行预计算&#xff0c;将计算好的结果保存成Cube&#xff0c;并存在HBase中&#xff0c;供查询时直接访问 将高复杂度的聚合运算、多表连接……操作转换成对预计算结果的查询。决定了Kylin拥有很好的快速查询、高并发能…

工业相机图像传感器的靶面大小

在机器视觉中&#xff0c;工业相机是一种比较重要的配件。而在 工业相机中&#xff0c;图像传感器又是最最关键核心的东西。而图像传感器的靶面的大小&#xff0c;往往直接关系到成像的质量。通常来讲&#xff0c;图像的成像质量与像素的大小成正比。这也就意味着&#xff0c;同…

SpringMVC+Mybatis学习

简单Web项目搭建&#xff1a; 一.流程 1. 导包 n个springMVC&#xff1b; 2个mybatis<其中一个是mybatis-spring>&#xff1b; 3个jackson包&#xff1b; 2. xml配置 web.xml和applicationContext.xml 3. 建包&#xff0c;建接口&#xff0c;建类 4. 建jsp 二&#xff1a…

PPT怎么在线转视频?

PPT在线转视频的方法有哪些&#xff1f;在PPT中有些播放上的问题还是可以进行文件的转换&#xff0c;下面就给大家简单的介绍一下方法。步骤一&#xff1a;PPT转视频的直接方法是进入迅捷PDF在线转换器网站中&#xff0c;点击导航栏中的视频音频转换中的PPT转视频&#xff1b; …

At least one JPA metamodel must be present!

使用spring jpa是一直报这个错&#xff0c;找了两天网上没有找到答案&#xff0c;最后发现时配置配错了&#xff0c;如下&#xff1a; <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa<…

夜貓子”必需的!——融合夜視技術

融合夜視技術是一項正在發展中的前沿技術&#xff0c;通過將多個工作在不同波段的夜視傳感器獲得的圖像經過處理後生成高質量的融合圖像&#xff0c;融合圖像的分辨率更高&#xff0c;能夠揭示出那些很難被看到的特徵。按照融合的方式&#xff0c;融合夜視技術可以分為數字融合…

Vue中登录模块

转载于:https://www.cnblogs.com/DZzzz/p/8921783.html

unity 中的UGUI 屏蔽鼠标穿透

void Update() { if(IsTouchedUI()) { Debug.Log("当前触摸在UI上"); } else { Debug.Log("当前没有触摸在UI上"); } } void OnMouseDown() { if(IsTouchedUI()) { Debug.Log("当前触摸在UI上"); } else { Debug.Log(&qu…

深度解析红外探测器

辐射/设计/技术之前我们跟大家解析了红外探测器的相关性能参数。 对于红外探测器的工作原理你了解多少呢&#xff1f;今天小编再继续上次的讲解&#xff0c;为大家解析非制冷红外焦平面探测器技术原理 及机芯介绍。 非制冷红外技术原理 非制冷红外探测器利用红外辐射的热效应&a…

js基础总结性能优化

一.加载和执行1.推荐所有的script标签尽可能放到body标签的底部&#xff0c;以尽量减少对整体页面下载速度的影响。2.组织脚本减少页面包含的scirpt标签数量&#xff0c;可以把多个文件合并成一个。3.无阻塞脚本1&#xff09;.延迟脚本defer:html解析完才加载&#xff0c;执行顺…

Python2 Python3 爬取赶集网租房信息,带源码分析

*之前偶然看了某个腾讯公开课的视频,写的爬取赶集网的租房信息,这几天突然想起来,于是自己分析了一下赶集网的信息,然后自己写了一遍,写完又用用Python3重写了一遍.之中也遇见了少许的坑.记一下.算是一个总结.*python2 爬取赶集网租房信息与网站分析 分析目标网站url寻找目标标…

红外热成像技术原理

目前&#xff0c;新的热成像仪主要采用非致冷焦平面阵列技术&#xff0c;集成数万个乃至数十万个信号放大器&#xff0c;将芯片置于光学系统的焦平面上&#xff0c;无须光机扫描系统而取得目标的全景图像&#xff0c;从而大大提高了灵敏度和热分辨率&#xff0c;并进一步地提高…

网站中公用头部与尾部

一、html 1. <iframe src"1.html" frameborder"0"></iframe> 2. <embed src"1.html"/> 二、写公用的js 文件&#xff0c;js中写字divde符串&#xff0c;然后在需要的页面适当位置引入公用的js. 三、ajax动态拉取填充 四、后端…