目录简介原理代码简介所谓可持久化线段树,就是将线段树的各个历史版本存储起来,以达到通过利用历史信息解决问题的目的。原理以权值线段树为例,我们来看看权值线段树是如何实现可持久化的。给出一个空的权值线段树,依次插入四个数:1 3 4 2首先,这是空的树(记为第 \(0\) 个版本):(其中键值 \(cnt\) 表示区间元素个数)现在插入第一个元素 1 ,注意到我们要保留每一个历史版本,所以我们不是在原
转载
2021-04-02 11:14:31
263阅读
2评论
333
转载
2017-08-13 15:55:00
71阅读
2评论
可持久化线段树 如果我们要维护一个可持续的,支持查询历史版本的数组该怎么做 给每一个版本建立一颗线段树?那太占空间了。
转载
2021-11-04 12:40:00
269阅读
2评论
可持久化线段树,意思是可以查询历史记录的线段树。又叫主席树。我们可以通过记录不同的根节点,并在每一个更新到的节点处新建必要的节点。询问不同版本的主席树,只需要进入不同的根节点即可。 例题: 给定n,m,输入n个数组成的数列,有m个询问,每次询问l,r这个区间中,第k小的数的值。 分析: 这个题可以巧
转载
2018-05-13 12:04:00
84阅读
P3834 【模板】可持久化线段树 2(主席树) 这是个非常经典的主席树入门题——静态区间第 \(k\) 小。 对于指定的闭区间 \([l, r]\) 查询其区间内的第 \(k\) 小值. 代码采用指针形式,区间为左闭右闭。 const ll M = 2e5 + 3; int n, N, m, to ...
转载
2021-07-19 08:58:00
118阅读
2评论
可持久化线段树是总称,主席树,函数式线段树是子集。主席树是可持久化权值线段树,函数式线段树是能够对历史版本进行修改。
原创
2021-07-22 16:19:04
120阅读
题目背景 UPDATE : 最后一个点时间空间已经放大 标题即题意 有了可持久化数组,便可以实现很多衍生的可持久化功能(例如:可持久化并查集) 题目描述 如题,你需要维护这样的一个长度为 N N N 的数组,支持如下几种操作 在某个历史版本上修改某一个位置上的值 访问某个历史版本上的某一位置的值 此
转载
2017-10-05 13:53:00
239阅读
2评论
区间第K小查询 description 给定一个长度为$n$ 的序列,每次对于一个区间$[l,r]$ ,求出这段区间中第$k$ 小的数的值。 \(n\le 10^5\) solution 首先考虑全局怎么做,即询问区间为$[1,n]$ 时。 我们可以建立权值线段树,对于其上的区间$[l,r]$ 记下 ...
转载
2021-06-06 00:10:00
109阅读
2评论
#include<stdio.h>
/** 单链表 **/
/* 利用指针可以为直接映射到改变上 且后续的地址传递比较方便,永远不要对表头做操作。只赋值。 */
struct No
#include<bits/stdc++.h> using namespace std; const int N=2e5+10; int n,m,q,tot=0; int a[N],b[N]; int T[N],sum[N<<5],L[N<<5],R[N<<5]; int build(int l,i ...
转载
2021-08-26 15:48:00
202阅读
题外话:可能很多人的知道主席树,但就没人好奇为什么叫主席树吗?发明者叫HJT,所以就叫主席树了。 主席树 解决区间第k大,以及需要查找历史数据的区间问题。 例题 以下为区间第k大问题的主席树解法。 先离散化。 对于求[1,n]区间的问题,只需要建一棵值域平衡树,维护在原数组中有多少个数在当前值域,查 ...
转载
2021-09-06 16:34:00
180阅读
点赞
1. 静态区间第 k 小 给定长度为$n$的序列$a_1,a_2,...,a_n$。$m$次询问,每次询问区间$[l,r]$中第$k$大的元素是多少。 \(n,m\le 2×10^5,a_i\le 10^9\) 解法 首先,建立$n$颗权值线段树,分别代表区间$[1,i]$中每一种权值出现的个数(离 ...
转载
2021-10-05 11:06:00
92阅读
2评论
题目背景 UPDATE : 最后一个点时间空间已经放大 标题即题意 有了可持久化数组,便可以实现很多衍生的可持久化功能(例如:可持久化并查集) 题目描述 如题,你需要维护这样的一个长度为 N N N 的数组,支持如下几种操作 在某个历史版本上修改某一个位置上的值 访问某个历史版本上的某一位置的值 此
原创
2022-05-27 20:39:12
169阅读
题目背景UPDATE : 最后一个点时间空间已经放大标题即题意有了可持久化数组,便可以实现很多衍生的可持久化功能(例如:
原创
2023-04-25 00:05:24
66阅读
之前也写过一篇讲主席树的文章,但是那时候理解的实在是太片面了。 首先,所考虑暴力一点的方式,对于每一个操作,我在之前的基础上单独建立一棵线段树,把...
原创
2022-08-25 11:15:35
134阅读
区间第k小:const int N = 100000 + 10, INF = 0x3f3f3f3f;int lson[N*20], rson[N*20], sum[N*20];int root[N];int tot;int a[N], b[N];void build(int l, int r, int &x){ x = ++tot; sum[x] = 0; if(l
原创
2017-09-01 19:06:06
63阅读
单点m区间
原创
2018-11-27 20:25:49
276阅读
上面就是我的丑图hh,一般主席树开40倍空间就可以了,每次插入的时候只需要比较前一个版本和这一个版本就行了,然后每个版本是区间可减的,比如询问l到r之间的第k大,只需要处理r-(l-1)版本的数量即可。#include<bits/stdc++.h>using namespace std;const int N=200010;struct node{ int l; int r; int sum;}tr[N*40];int cnt;int a[N];int root[N];v
原创
2021-07-09 14:00:21
140阅读
主席树为什么叫主席树?据说因为它是一个名字缩写为$HJT$的神犇发明的,与当时主席的名字缩写一样......
转载
2018-10-28 14:29:00
186阅读
2评论
可持久化数据结构 可持久化 首先需要介绍可持久化的概念。可持久化就是,保存下来的每一次变化,所影响的那些节点。干说会比较抽象,所以我们以两道题目为例子,来展示可持久化的作用和含义。 可持久化tire树 可以用一张图来展示,可持久化tire树的操作。 当我们,插入一个新节点时,直接从该节点指向除了要插 ...
转载
2021-08-26 19:06:00
84阅读
2评论