线段树学习笔记 下

news2024/9/21 17:32:43

可持久化线段树

上面两篇是几年前写的,笔者今日才加以整理,如有错误请见谅。

线段树加上版本就是可持久化线段树。

Problem Intro

给定一个数组,只需要单点修改单点查询,但要维护版本。

具体说,每一次操作可能从任意版本读取,也可以从任意版本修改。

提交地址可见模板题。

Solution

image helper
如图,当插入时可以再拉一条路径作为新的版本,不必再新建一个数组,复杂度 O ( n × dep ) O(n \times\text{dep}) O(n×dep)

然后考虑访问,对于每一个版本考虑只存储其根结点,后面的点使用动态开点即可。

这就是可持久化线段树(主席树)。其实不算太难。

Code

#include <bits/stdc++.h>

using namespace std;

int n, m, a[26000001];
struct node{
	int l, r, lp, rp, val;
} tree[26000001];
	int cnt = 0, tot = 0, ver[26000001];
		
void save_ver(int rt){
	ver[++tot] = rt;
}
int get_ver(int x){
	return ver[x];
}
			
int build(int l, int r){
	int ind = cnt; cnt++;
	tree[ind].l = l, tree[ind].r = r;
	if(l == r){
		tree[ind].val = a[l];
		return ind;
	}
	int mid = (l + r) >> 1;
	tree[ind].lp = build(l, mid);
	tree[ind].rp = build(mid + 1, r);
	return ind;
}
int mod(int x, int y, int k){
	int ind = cnt; cnt++;
	tree[ind].l = tree[x].l, tree[ind].r = tree[x].r;
	if(tree[ind].l == tree[ind].r){
		tree[ind].val = k;
		return ind;
	}
	int mid = (tree[ind].l + tree[ind].r) >> 1;
	tree[ind].lp = tree[x].lp, tree[ind].rp = tree[x].rp;
	if(y <= mid)
		tree[ind].lp = mod(tree[x].lp, y, k);
	else
		tree[ind].rp = mod(tree[x].rp, y, k);
	return ind;
}
int query(int x, int y){
	if(tree[x].l == tree[x].r)
		return tree[x].val;
	int mid = (tree[x].l + tree[x].r) >> 1;
	if(y <= mid)
		return query(tree[x].lp, y);
	else
		return query(tree[x].rp, y);
}
double solve(int testcase, ...){
	
	double used_time = clock();
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= n; i++){
        scanf("%d", a + i);
	}
	ver[0] = build(1, n);
	for(int i = 1; i <= m; i++){
		int v, op, x, y;
		scanf("%d%d%d", &v, &op, &x);
		if(op == 1){
            scanf("%d", &y);
			save_ver(mod(get_ver(v), x, y));
		}
		else{
		    int curr = query(get_ver(v), x);
			printf("%d\n", curr);
			save_ver(mod(get_ver(v), x, curr));
		}
	}
		
	return clock() - used_time;
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);

#ifndef ONLINE_JUDGE
	printf("Solved, used time %.0lfms.\n", solve(1, "local"));
#else
	solve(1, ONLINE_JUDGE);	
#endif
	return 0;
}

About Range Update

这里懒标记是行不通的。

主要介绍一下标记永久化

大概的意思就是把 lazy 标记存起来,每次统计时加上这个标记就可以了。

代码就不放了,我也没写代码

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

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

相关文章

Python算法100例-2.3 求车速

完整源代码项目地址&#xff0c;关注博主私信源代码后可获取 1.问题描述2.问题分析3.算法设计4.确定程序框架5.完整的程序6.问题拓展 1&#xff0e;问题描述 一辆以固定速度行驶的汽车&#xff0c;司机在上午10点看到里程表上的读数是一个对称数&#xff08;即这个数从左向右…

解决vscode每次git pull/push都需要输入账号密码

git如何设置用户名 邮箱 密码 //设置用户 git config --global user.name "xxx"//设置邮箱 git config --global user.email "xxxxxx.com"//设置密码 git config --global user.password "xxxxx"解决每次git pull/push操作都需要输入密码 git …

【安卓基础3】Activity(一)

&#x1f3c6;作者简介&#xff1a;|康有为| &#xff0c;大四在读&#xff0c;目前在小米安卓实习&#xff0c;毕业入职 &#x1f3c6;本文收录于 安卓学习大全&#xff0c;欢迎关注 &#x1f3c6;安卓学习资料推荐&#xff1a; 视频&#xff1a;b站搜动脑学院 视频链接 &…

VMware虚拟机从一台电脑复制到另一台电脑

1 概述 在一台电脑上利用虚拟机安装了OS系统&#xff0c;特别是如果虚拟机中的系统进行了各种繁琐的配置&#xff0c;因为换电脑或者需要在其他电脑上配置&#xff0c;这个时候就可以将虚拟机中的系统复制拷贝一份到新电脑上&#xff0c;省时省力。 2 操作步骤 2.1 vmx文件 …

Mac OS 搭建C++开发环境【已解决】

Mac OS 搭建C开发环境 文章目录 Mac OS 搭建C开发环境一、安装命令行工具&#xff1a;二、安装vscode三、安装gcc3.1 安装Homebrew3.2 安装gcc3.3 修改配置 四、更改VSCode默认编译器五、安装gdb六、安装Cmake && git七、编译运行 本地环境&#xff1a; Mac OS Sonoma …

LabVIEW高效核磁测井仪器多线程优化

LabVIEW高效核磁测井仪器多线程优化 为提高核磁测井仪器的测试效率与性能&#xff0c;开发了基于LabVIEW的多线程优化模型。该研究针对传统的核磁测井仪器软件&#xff0c;在多任务调度测试和并行技术需求上存在的效率不高和资源利用率低的问题&#xff0c;提出了一个多线程优…

算法沉淀——穷举、暴搜、深搜、回溯、剪枝综合练习一(leetcode真题剖析)

算法沉淀——穷举、暴搜、深搜、回溯、剪枝综合练习一 01.全排列02.子集03.找出所有子集的异或总和再求和04.全排列 II05.电话号码的字母组合 01.全排列 题目链接&#xff1a;https://leetcode.cn/problems/permutations/ 给定一个不含重复数字的数组 nums &#xff0c;返回其…

二十六、直方图均衡化

项目功能实现&#xff1a;对灰度图片进行直方图均衡化操作 按照之前的博文结构来&#xff0c;这里就不在赘述了 一、头文件 histogram_equal.h #pragma once#include<opencv2/opencv.hpp>using namespace cv;class HISTOGRAM_EQUAL { public:void histogram_equal(Mat…

公众号怎么线上公证?

公众号迁移有什么作用&#xff1f;只能变更主体吗&#xff1f;公众号迁移的作用可不止变更主体这一个哦&#xff01;还可以把 A 账号的粉丝、文章素材、违规记录等迁移到 B 账号上。这样一来&#xff0c;你就可以在不失去原有粉丝的情况下&#xff0c;更好地管理和运营公众号啦…

【MySQL】连接查询和自连接的学习和总结

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-x4sPmqTXA4yupW1n {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

idea 2022.3 配置svn插件

配置中遇到的问题 1.没有安装svn.exe这个 原本是安装了TortoiseSVN 但没有安装客户端命令需要补充这个客户端命令的安装 才能引用 2.路径引用的问题 原本是在 D:\Program Files\TortoiseSVN 这里存在空格 会产生问题 网上说的使用progra~1 或者 加双引号 均不能成功 最…

SolidWorks的使用笔记

K因子 成型工具 自己设计的成型工具零件&#xff0c;保存文件类型为&#xff1a;

Servlet实现图片的上传和显示

本篇文章是在上一篇文章上改进而来 一、图片上传需要引用的jar包 链接&#xff1a;https://pan.baidu.com/s/17FLjlWlNEG5YnS_dl3C8WA 提取码&#xff1a;wbis 二、最后的结果 三、更改数据库增加图片路径字段path 四、前端页面增加图片上传按钮,和上传的复选框 代码 上传…

[c++] 工厂模式 + cyberrt 组件加载器分析

使用对象的时候&#xff0c;可以直接 new 一个&#xff0c;为什么还需要工厂模式 &#xff1f; 工厂模式属于创建型设计模式&#xff0c;将对象的创建和使用进行解耦&#xff0c;对用户隐藏了创建逻辑。 个人感觉上边的表述并没有说清楚为什么需要使用工厂模式。因为使用 new 创…

达尔克仪器设备邀您观摩2024生物发酵产品与技术装备展

参展企业介绍 达尔克本着“诚信、求精、协作、创新”的企业精神&#xff0c;以专业的技术、优良的品质和完善的服务&#xff0c;与广大客户共创辉煌未来。 我们的产品——包括水质分析、压力、温度、流量、物位等工业在线过程控制仪表、其他类型传感器以及自动化控制方案——全…

HTTPS原理及配置

HTTPS 1. 对称加密和非对称加密2. 加密算法&#xff08;了解&#xff09;3. HTTPS 协议介绍4. HTTPS 原理4.1. HTTP 访问过程4.2. HTTPS访问过程4.3. HTTPS 总结4.4. CA 证书认证机构 HTTPS 基本原理 HTTPS&#xff08;全称&#xff1a;HyperText Transfer Protocol over Secur…

模型 HBG(品牌增长)

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_总纲目录。品牌增长法。 1 HBG(品牌增长)模型的应用 1.1 江小白使用HBG模型提高品牌知名度和销售额 选择受众市场&#xff1a;江小白的目标客户是年轻人&#xff0c;他们喜欢简单、时尚的产品。因此&#xff0c;江…

【最新Dubbo3深入理解】Dubbo3源码中的一些小技巧

欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复 「资料」 可领取编程高频电子书&#xff01; 在我后台回复「面试」可领取硬核面试笔记&#xff01; 文章导读地址…

如何用 Screen Studio 灵活高效录制可复用的教学视频?

如果你跟我一样&#xff0c;录制视频是高频刚需&#xff0c;那你不难体会到它对用户痛点的理解和解决。 挑战 作为一名教师兼 UP 主&#xff0c;我经常录制视频。 之前录制教程类视频&#xff0c;我往往采用自己的标准「懒人法」—— 从头到尾&#xff0c;用 OBS 录制屏幕和摄像…

R语言空间分析、模拟预测与可视化

随着地理信息系统&#xff08;GIS&#xff09;和大尺度研究的发展&#xff0c;空间数据的管理、统计与制图变得越来越重要。R语言在数据分析、挖掘和可视化中发挥着重要的作用&#xff0c;其中在空间分析方面扮演着重要角色&#xff0c;与空间相关的包的数量也达到130多个。在本…