例1 区间第kk小 P3834 【模板】可持久化线段树 2 怎么做呢? 我们可以按顺序插入数组中的每个元素。 这样的话就有nn个历史版本。 当我们想知道[l,r][l,r]的第kk小时,我们可以只关注版本l−1l−1和版本rr。 这样的话,又因为这是棵权值线段树,所以可以通过当前节点的sizesize之差来判断第kk小在什么地方。
联想到之前学过的权值线段树,我们有一个很直观的想法: 开设nn个权值线段树,其中ii号权值线段树存放区间[1,i][1,i]中各数字的出现情况。由于权值线段树满足可加减性,所以区间[l,r][l,r]可以通过[1,l−1][1,l−1]与[1,r][1,r]合并得来。这样,我们就可以同时查询两个权值树,通过递归寻找到适合的数...
洛⾕P3834【模板】可持久化线段树2(主席树)题⽬背景 这是个⾮常经典的主席树⼊门题——静态区间第 k k⼩。数据已经过加强,请使⽤主席树。同时请注意常数优化。题⽬描述 如题,给定 n n个整数构成的序列 a a,将对于指定的闭区间 [l,r][l,r] 查询其区间内的第 k k⼩值。输⼊格式 ...
模板如下: //主席树#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;//前一个版本,当前版本,当前值域,要插入的值voidmodify(intpre,int&now,intl,intr...
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;...
P3834 【模板】可持久化线段树 2(主席树)题意 Luogu P3834 维护一个数组(([1 , n])), 可以在任意区间查询第 (k) 小值((m) 次). (1 leq n leq 2 * 10^5), (1 leq n leq 2 * 10^5), (-10^9 leq a_i leq 10^9) 区间第 (k) 小值 统计区间内各数出现次数, 从小到大统计, ...
using ll = long long; using p = pair<int, int>; const double pi(acos(-1)); const int inf(0x3f3f3f3f); const int mod(1e9 + 7); const int maxn(2e5 + 10); int cnt, a[maxn], root[maxn]; vector<int> nums; struct node { ...
很好的避免了MLE , 一般的n\le 2*10^5 也就是log_2n<18 n\lceil log_2n \rceil+3n-1\le18n+3n-1 n\lceil log_2n \rceil+3n-1\le21n-1 所以开21n个节点就够了,当然也可以稍微开的多一点 img code 记录详情 - 洛谷 // Luogu P3834 【模板】可持久化线段树 2 // https://www.luogu...
P3834 【模板】可持久化线段树 2 */ #include<algorithm> #include<iostream> using namespace std; const int N = 2e5+10; inline int read() { register char c = getchar(); register int x = 0 , f = 0; while(c < '0' || c > '9') f |= c == '-' , c = getchar(); whil...
题意解读:静态区间第k小问题,可持久化线段树(也称为主席树)模版题。 解题思路: 一、朴素想法:如何求完整区间[1,n]第k小 1、权值线段树 设n个数构成序列a,b数组代表a中元素出现的次数,即b数组的构建方式为对每一个a[i]做b[a[i]]++。 针对b数组区间构建的线段树,称为权值线段树,权值线段树的节点维护的...