例1 区间第kk小 P3834 【模板】可持久化线段树 2 怎么做呢? 我们可以按顺序插入数组中的每个元素。 这样的话就有nn个历史版本。 当我们想知道[l,r][l,r]的第kk小时,我们可以只关注版本l−1l−1和版本rr。 这样的话,又因为这是棵权值线段树,所以可以通过当前节点的sizesize之差来判断第kk小在什么地方。
// Luogu P3834 【模板】可持久化线段树 2 // https://www.luogu.com.cn/problem/P3834 2024-02-27 20:26:19 #include <bits/stdc++.h> using namespace std; #define all(a) begin(a), end(a) #define int long long constexpr int N = 2E5 + 10LL; #define lc(x) tr[x].ch[0] #...
总所周知,普通线段树每次修改会遍历logn个点,那么我们在每次修改时都把这logn个点复制一份出来再修改,生成一个历史版本,就是可持久化线段树了,这里每一个点都是动态开点,而不是提前开好的,所以每个点内要存他的左右儿子节点的编号,不再是传统线段树的 2*p 和 2*p+1。 主席树有两种写法,一个是提前分配好所有...
对于每次询问的 \([L,R]\) 范围内第 \(k\) 小的数, 设\(t_1\) 为第 \(L-1\) 个版本的线段树,\(t_2\) 为第 \(R\) 个版本的线段树,则查询第 \(k\) 小的数,若 \(t_2\) 的左子树元素个数 \(\ge t_1 + k\) 的左子树元素个数 \(+ k\),则在左子树;否则,在右子树。 示例代...
P3834 【模板】可持久化线段树 2(主席树) 静态查询区间第k小 离散化挂了... 注意$|a_i|<=10^9$,所以离散化的时候$b[0]=-2e9$以防止$0$被忽略录入 #include<cstdio>#include<algorithm>usingnamespacestd;constintN=200003;intn,u,m,a[N],b[N],rt[N],lc[N*18],rc[N*18],s[N*18],U;...
主席树的代码也是跟着网上视频敲的,没有彻底搞懂原理,所以先记录在这。 模板如下: //主席树#include<iostream>#include<algorithm>#include<vector>usingnamespacestd;constintmaxn=100001;intnum[maxn],num2[maxn];introot[maxn];structnode{intl,r,val;}Node[maxn*40];inttot=0,node_cnt=0;//前一个版...
例如上面这个线段树,储存了99个元素1,2,…,91,2,…,9,我们对[4,6][4,6]这个区间的元素统一+1+1,其中绿色和蓝色代表会更新的节点,也就是新版本会额外创建的新节点。 对于这些节点,我们会将它实际更新,更新方式就是计算区间交叉长度来获取增长值。其中,蓝色的节点比较特殊,它们会被标上懒惰标记。这些步骤和...
那就意味着,在序列S中,大于等于M的数大于等于k/2。如果把序列S转化为T,T[i]=1(S[i]>=M),-1(S[i]<M),则ΣT[i]一定非负。 同理,如果对于任意一个M。将序列S转化为T之后,如果ΣT[i]非负。那么这个序列的中位数一定大于等于M。 回到这道题。我们可以先考虑一个弱版:只询问一次。
引入离散化, 最多只会出现 nn 个数字, 将线段树根的区间优化到 [1,2∗105][1,2∗105] 可持久化 如果给每个位置都建一棵权值线段树, 空间一定不够用, 但是思考每一个位置的线段树相对前一个位置的线段树的区别只是某点权值加一, 想到可持久化. 参见可持久化数组 在处理某位置的前缀和的时候, 从上一个...
【模板】可持久化线段树 2(主席树) 题目链接https://www.luogu.com.cn/problem/P3834 代码 #include<iostream>#include<string>#include#include<set>//#include<unordered_map>#include<queue>#include<cstdio>#include<vector>#include<cstring>#include<algorithm>#include<iomanip>#include<stack>#include<cmath...