P3919 【模板】可持久化线段树 1(可持久化数组)

题目描述

如题,你需要维护这样的一个长度为 N 的数组,支持如下几种操作

  1. 在某个历史版本上修改某一个位置上的值

  2. 访问某个历史版本上的某一位置的值

此外,每进行一次操作(对于操作2,即为生成一个完全一样的版本,不作任何改动),就会生成一个新的版本。版本编号即为当前操作的编号(从1开始编号,版本0表示初始状态数组)

输入格式

输入的第一行包含两个正整数 N,M, 分别表示数组的长度和操作的个数。

第二行包含N个整数,依次为初始状态下数组各位的值(依次为 ai​,1≤i≤N)。

接下来M行每行包含3或4个整数,代表两种操作之一(i为基于的历史版本号):

  1. 对于操作1,格式为vi​ 1 loci​ valuei​,即为在版本vi​的基础上,将 loci​​ 修改为 valuei​。

  2. 对于操作2,格式为 2  vi​ 2 loci​,即访问版本vi​中的 aloci​​的值,注意:生成一样版本的对象应为 vi​

输出格式

输出包含若干行,依次为每个操作2的结果。

输入输出样例

输入 #1复制

5 10
59 46 14 87 41
0 2 1
0 1 1 14
0 1 1 57
0 1 1 88
4 2 4
0 2 5
0 2 4
4 2 1
2 2 2
1 1 5 91

输出 #1复制

59
87
41
87
88
46

解析:

可持续化线段树是动态开点,可以记录历史版本的线段树。

build是初始建立一个 从 1 ~ tot节点的线段树。它的叶子节点被赋值。

为什么只有叶子节点被赋值呢?

答:线段树是以区间进行搜索递归,只有当左区间等于右区间是,l==r是才可以被赋值,其他时候一般求个数和区间和或区间的最大值。

int n,m,a[N];
int root[N],tot = 0;//root为那个历史版本的根节点的  
int ls[N*25],rs[N*25],val[N*25];//ls  rs为根节点的左右儿子
//因为是动态开点,不像普通的线段树一样 u<<1   u<<1|1
//它是由tot进行赋值的 void build(int &u,int l,int r)//引用u版本进行修改 
{u = ++tot;if(l == r) {val[u]=a[l];return;} build(ls[u],l,mid);//动态开店 就是 下一层 ls[u] = totbuild(rs[u],mid+1,r);  
} 

当你理解了如何建立可持续化线段树时,你将成功一大步了。

在对可持续化线段树进行修改的,我们重新对根节点进行赋值。

并对他进行访问它的左右儿子的节点,将上一版本的左右儿子暂存在当前父节点上。

将需要开品的儿子经行重新开辟。

这个样子大大的缩小的空间复杂度。

查询直接查询左右儿子即可。

代码如下;

#include<bits/stdc++.h>
using namespace std;
#define N 1000005
#define mid ((l+r)>>1)
int n,m,a[N];
int root[N],tot = 0;//root为那个历史版本的根节点的  
int ls[N*25],rs[N*25],val[N*25];//ls  rs为根节点的左右儿子
//因为是动态开点,不像普通的线段树一样 u<<1   u<<1|1
//它是由tot进行赋值的 void build(int &u,int l,int r)//引用u版本进行修改 
{u = ++tot;if(l == r) {val[u]=a[l];return;} build(ls[u],l,mid);//动态开店 就是 下一层 ls[u] = totbuild(rs[u],mid+1,r);  
} void change(int &u,int v,int l,int r,int p,int x){u = ++tot;//先全部都赋值为前一个版本的线段树的 左右儿子 的 值//因为是动态开店的 他们的值不会重复 ls[u] = ls[v];rs[u] = rs[v]; if(l == r){val[u] = x;return;}if(p <= mid) change(ls[u],ls[v],l,mid,p,x);else{change(rs[u],rs[v],mid+1,r,p,x);}
}int query(int u,int l,int r,int p)
{if(l == r) return val[u];if(p <= mid) return query(ls[u],l,mid,p);else return query(rs[u],mid+1,r,p);
}int main()
{scanf("%d%d",&n,&m);for(int i = 1;i <= n;i++){scanf("%d",a+i);}build(root[0],1,n);for(int i = 1;i <= m;i++){int ver,op,p,x;scanf("%d%d",&ver,&op);if(op==1){scanf("%d%d",&p,&x);change(root[i],root[ver],1,n,p,x);}else{scanf("%d",&p);printf("%d\n",query(root[ver],1,n,p));root[i] = root[ver];//当前第i个版本为 ver }}return 0;
}

时间复杂度为:O(n*longn)线段树的查询的建立。

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

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

相关文章

需求工程、需求规格说明的具体方式以及实践

需求规格说明&#xff08;SRS, Software Requirements Specification&#xff09;是需求工程过程中的关键产出之一。它详细描述了软件系统必须满足的功能和非功能需求&#xff0c;为项目团队提供了清晰的开发指南。一个好的需求规格说明书不仅能够指导开发和测试工作&#xff0…

curl在window及linux中的使用及区别

目录 内容介绍 测试一&#xff08;GET,application/json&#xff09; 归纳 测试二&#xff08;GET,x-www-form-urlencoded&#xff09; 归纳 测试三&#xff08;POST,FORM-DATA&#xff09; 归纳 测试四&#xff08;POST,x-www-form-urlencoded&#xff09; 归纳 总结…

yolov5交互式界面 V5.0-6.0版本通用界面-yolo-pyqt-gui(通用界面制作+代码)

往期热门博客项目回顾&#xff1a; 计算机视觉项目大集合 改进的yolo目标检测-测距测速 路径规划算法 图像去雨去雾目标检测测距项目 交通标志识别项目 yolo系列-重磅yolov9界面-最新的yolo 姿态识别-3d姿态识别 深度学习小白学习路线 yolo GUI OYQT界面 YOLOv5…

pycharm连接服务器运行时找不到文件或目录

选择你要修改的python interpreter 进入下图界面&#xff0c;默认选择的是Deployment configuration,需要将其改成SSH。 再将上图python interpreter path和pycharm helpers path 配置成服务器上相应地址即可。 over

校园跑腿小程序源码系统多校园版 跑腿达人入驻接单 带完整的安装代码包以及系统部署教程

在数字化时代的浪潮中&#xff0c;校园生活的便捷性和高效性成为了广大师生的共同追求。为了满足这一需求&#xff0c;罗峰给大家分享一款适用于多校园的跑腿小程序源码系统——校园跑腿小程序源码系统多校园版。该系统不仅提供了完整的安装代码包&#xff0c;还附带了详尽的系…

# 14 React 自定义Hook详解

自定义 Hook 是一个函数&#xff0c;其名称以 “use” 开头&#xff0c;函数内部可以调用其他 Hook。自定义 Hook 是一个函数&#xff0c;其名称以 “use” 开头&#xff0c;函数内部可以调用其他 Hook。下面是几个自定义 Hook 的例子以及需要注意的知识&#xff1a; 1. 使用状…

用指针处理链表(一)

1链表概述 链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。我们知道,用数组存放数据时,必须事先定义固定的长度(即元素个数)。比如,有的班级有100人&#xff0c;而有的班只有30人&#xff0c;如果要用同一个数组先后存放不同班级的学生数据,则必须定义长度…

为wordpress特定分类目录下的内容添加自定义字段

在WordPress中&#xff0c;您可以使用自定义字段(Custom Fields)或称为元数据(Meta Data)来为特定分类目录下的内容添加额外的信息。自定义字段可以附加到文章、页面、用户和其他对象上。以下是一个逐步指南&#xff0c;介绍如何为特定分类目录下的内容添加自定义字段&#xff…

男青年穿什么裤子好看?适合男生穿的百搭神裤

这几年衣服的款式可谓是越来越多了&#xff0c;很多男生在选裤子的时候都发现虽然款式越来越多&#xff0c;但现在市面上的裤子质量参差不齐&#xff0c;导致难以选择。而且还有很多商家为了利润采用低廉的材料&#xff0c;从而上身舒适性极差。 那么今天就给大家详细介绍几点…

web3 token 如何理解

"Web3 Token"是指建立在Web3技术堆栈上的数字令牌。为了更好地理解这个概念&#xff0c;让我们逐步解释&#xff1a; Web3&#xff1a;指的是下一代互联网&#xff08;Web3.0&#xff09;&#xff0c;它是基于区块链技术的去中心化网络。Web3的核心理念是去中心化、安…

cpu自动加速@TDP@睿频TurboBoost@PB精准频率提升技术

文章目录 自动加速技术Intel超频睿频工作原理:特点超频技术对比 AMDPBO PB2 TDP定义与意义TDP与实际功耗TDP的应用TDP的发展与挑战 Intel相关指标PL1 (Power Limit 1)PL2 (Power Limit 2)PL1 与 PL2 的关系与应用场景小结查看 AMD相关指标主板厂商与用户干预 高端型号的加速技术…

3D软件坐标系速查

本文介绍不同3D软件的世界坐标系之间的差异及其工作原理。 基本上&#xff0c;游戏引擎和3D软件包最重要的问题是根据软件的坐标轴系统创建资产&#xff0c;正确缩放它们并根据要完成的工作设置枢轴系统。 坐标系正确性的定义可能会根据模型导入的游戏引擎或 3D 软件而变化。…

开放式耳机性价比高的品牌有哪些呢?五大高性价比选购清单

不入耳开放式蓝牙耳机近两年开始火起来了&#xff0c;因为它佩戴的舒适性和安全性两方面受到了很多人的关注。开放式的设计&#xff0c;就算不放进耳朵里也能听歌&#xff0c;同时加上它独特的空气传导的传声途径&#xff0c;整体的音质还是很不错的。不压耳&#xff0c;不涨耳…

申请发明专利的基本条件是什么?发明专利需要什么资料?

发明专利申请的基本条件是什么&#xff1f;发明专利需要的资料有啥?发明专利大家真的了&#xff0c;那么今天的这2个问题我们就一起来看看吧。 发明专利申请的基本条件是什么&#xff1f; 在进行技术开发、新产品研制过程中取得的成果&#xff0c;因其技术水平较高&#xff0…

2016年认证杯SPSSPRO杯数学建模D题(第二阶段)NBA是否有必要设立四分线全过程文档及程序

2016年认证杯SPSSPRO杯数学建模 D题 NBA是否有必要设立四分线 原题再现&#xff1a; NBA 联盟从 1946 年成立到今天&#xff0c;一路上经历过无数次规则上的变迁。有顺应民意、皆大欢喜的&#xff0c;比如 1973 年在技术统计中增加了抢断和盖帽数据&#xff1b;有应运而生、力…

Filter PWM和普通PWM区别

Filter PWM和普通PWM是两种不同的脉冲宽度调制&#xff08;PWM&#xff09;技术。它们的区别主要在于滤波器的使用和输出信号的特性。 普通PWM是一种基本的PWM技术&#xff0c;它通过改变信号的脉冲宽度来控制输出电平的平均值。普通PWM信号的频率通常较高&#xff0c;可以达到…

通过MobaXterm工具远程连接可视化服务器桌面并操控

目录 一、MobaXterm工具二、MobaXterm工具可视化服务器目录三、MobaXterm工具可视化服务器桌面 一、MobaXterm工具 MobaXterm是一款功能强大的远程连接工具&#xff0c;可以用于连接到各种类型的服务器&#xff0c;包括Linux、Windows和MacOS。它支持多种协议&#xff0c;包括…

【C语言】linux内核pci_enable_device函数和_PCI_NOP宏

pci_enable_device 一、注释 static int pci_enable_device_flags(struct pci_dev *dev, unsigned long flags) {struct pci_dev *bridge;int err;int i, bars 0;/** 此时电源状态可能是未知的&#xff0c;可能是由于新启动或者设备移除调用。* 因此获取当前的电源状态&…

【Java】哈希表

文章目录 一、概念二、哈希冲突2.1概念2.2设计合理的哈希函数-避免冲突2.3调节负载因子-避免冲突2.4闭散列-冲突解决&#xff08;了解&#xff09;2.5开散列/哈希桶-冲突解决&#xff08;重点掌握&#xff09; 三、代码实现3.1成员变量及方法的设定3.2插入3.3重新哈希3.4 获取到…

YT8531调试记录

总结 还是从设备树&#xff0c;mac驱动&#xff0c;mac驱动对mdio总线的注册&#xff0c;phy驱动 &#xff0c;phy的datasheet&#xff0c;cpu的datasheet 几个方面来看来看 0.确认供电&#xff0c;以及phy的地址(一般会有多个地址&#xff0c;根据相关引脚电平可配置) 1.确…