【主席树】luogu_3919 可持久化数组(可持久化线段树/平衡树)

2024-01-30 04:18

本文主要是介绍【主席树】luogu_3919 可持久化数组(可持久化线段树/平衡树),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题意

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

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

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

思路

主席树模板

代码

#include<cstdio>
#include<algorithm>struct SegmentTree {int lc, rc;int dat;
} tree[20000001];
int a[1000001], root[1000001];
int tot, n, m;int build(int l, int r) {int p = ++tot;if (l == r) {tree[p].dat = a[l];return p;}int mid = (l + r) >> 1;tree[p].lc = build(l, mid);tree[p].rc = build(mid + 1, r);return p;
}int modify(int now, int l, int r, int x, int val) {int p = ++tot;tree[p] = tree[now];if (l == r) {tree[p].dat = val;return p;}int mid = (l + r) >> 1;if (x <= mid)tree[p].lc = modify(tree[now].lc, l, mid, x, val);elsetree[p].rc = modify(tree[now].rc, mid + 1, r, x, val);return p;
}int ask(int now, int l, int r, int x) {if (l == r) return tree[now].dat;int mid = (l + r) >> 1;if (x <= mid) return ask(tree[now].lc, l, mid, x);else return ask(tree[now].rc, mid + 1, r, x);
}int main() {scanf("%d %d", &n, &m);for (int i = 1; i <= n; i++)scanf("%d", &a[i]);root[0] = build(1, n);int ver, op, w, v;for (int i = 1; i <= m; i++) {scanf("%d %d", &ver, &op);if (op == 1) {scanf("%d %d", &w, &v);root[i] = modify(root[ver], 1, n, w, v);} else {scanf("%d", &w);printf("%d\n", ask(root[ver], 1, n, w));root[i] = root[ver];}}
}

这篇关于【主席树】luogu_3919 可持久化数组(可持久化线段树/平衡树)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/659076

相关文章

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

Redis的持久化之RDB和AOF机制详解

《Redis的持久化之RDB和AOF机制详解》:本文主要介绍Redis的持久化之RDB和AOF机制,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述RDB(Redis Database)核心原理触发方式手动触发自动触发AOF(Append-Only File)核

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序

Redis持久化机制之RDB与AOF的使用

《Redis持久化机制之RDB与AOF的使用》:本文主要介绍Redis持久化机制之RDB与AOF的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Redis持久化机制-RDB与AOF一、RDB持久化机制1、RDB简介2、RDB的工作原理3、RDB的优缺点4

Java数组初始化的五种方式

《Java数组初始化的五种方式》数组是Java中最基础且常用的数据结构之一,其初始化方式多样且各具特点,本文详细讲解Java数组初始化的五种方式,分析其适用场景、优劣势对比及注意事项,帮助避免常见陷阱... 目录1. 静态初始化:简洁但固定代码示例核心特点适用场景注意事项2. 动态初始化:灵活但需手动管理代

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的