题目描述

给定n个整数构成的序列,将对于指定的闭区间查询其区间内的第k小值。

输入输出格式

输入格式

第一行包含两个正整数n,m,分别表示序列的长度和查询的个数。

第二行包含n个整数,表示这个序列各项的数字。

接下来m行每行包含三个整数l,r,k, 表示查询区间[l,r]内的第k小值。

输出格式

输出包含m行,每行一个整数,依次表示每一次查询的结果

输入输出样例

输入样例

5 5
5957 6405 15770 26287 26465
2 2 1
3 4 1
4 5 1
1 2 2
4 4 1

输出样例

6405
15770
26287
25957
26287

题解

直接康代码吧,个人觉得注释还是蛮详细的

#include <bits/stdc++.h>
using namespace std;
const int N=2e5+2;
int tot,n,m,l,r,k;//tot 所有节点的数量
struct node{
int lc,rc;//表编号为i的节点的左/右儿子的编号
int cnt;//表编号为i的节点所代表的区间内数字出现的次数
}tr[N<<5];
int a[N],b[N];//a[i]为原数组 b[i]为排序后数组
int rt[N];//插入i个点后的树的根节点编号
int build(int l,int r) {//建一个空树(所有cnt都为0)
int p=++tot; //p为当前节点编号
if(l==r) return p;
int mid=(l+r)>>1;
tr[p].lc=build(l,mid);
tr[p].rc=build(mid+1,r);
return p; //返回当前节点的编号
}
int update(int pre,int l,int r,int x) { //pre为旧树该位置节点下标
// x为 修改位置下标
int p=++tot; //新建节点
tr[p].lc=tr[pre].lc;
tr[p].rc=tr[pre].rc;
tr[p].cnt=tr[pre].cnt+1;
//copy 原节点信息
if(l==r) return p;//到达底层,回溯
int mid=(l+r)>>1;
if(x<=mid) tr[p].lc=update(tr[pre].lc,l,mid,x);
//x出现在左子树 因此右子树保持与旧树相同 修改左子树
else tr[p].rc=update(tr[pre].rc,mid+1,r,x);
//否则前往右子树
return p;//返回线段树中的编号
}
int ask(int u,int v,int l,int r,int k) {
//在u,v两个节点上,数域为[l,r],求第k小数
if(l==r) return b[l]; //找到第k小 l/r是节点编号 所以答案是b[l/r]
int mid=(l+r)>>1;
int p=tr[tr[v].lc].cnt-tr[tr[u].lc].cnt;
//则p= (1~r)树的左节点数字出现的次数 - (1~(l-1))树的左节点数字出现的次数
//即p等于([l,r])树左儿子数字出现的次数
if(p>=k) return ask(tr[u].lc,tr[v].lc,l,mid,k);
//第k小的数字在左子树处
else return ask(tr[u].rc,tr[v].rc,mid+1,r,k-p);
//否则去右子树处找第k-p小的数字
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) {
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b+1,b+1+n);
int size=unique(b+1,b+1+n)-b-1;
//size为线段树维护的数组的大小,即b数组中不重复的数字的个数
rt[0]=build(1,size); //初始化 建立一颗空树 并把该树的根节点的编号赋值给rt[0]
for(int i=1;i<=n;i++){
int x=lower_bound(b+1,b+1+size,a[i])-b;
//在b的 [1,size+1)--->[1,size] 中二分查找第一个大于等于a[i]的b[x]
rt[i]=update(rt[i-1],1,size,x);
//更新a[i]带来的影响
//并将新树的根节点的编号赋值给rt[i]
}
while(m--){
scanf("%d%d%d",&l,&r,&k);
int ans=ask(rt[l-1],rt[r],1,size,k);
printf("%d\n",ans);
}
return 0;
}

完结撒花❀

「洛谷 P3834」「模板」可持久化线段树 题解报告的更多相关文章

  1. 【洛谷】P3919 【模板】可持久化线段树(主席树)

    题目 传送门:QWQ 分析 主席树的模板,囤着 代码 #include <bits/stdc++.h> using namespace std; ; ], rs[N*], root[N*] ...

  2. 【整体二分】【P3834】 【模板】可持久化线段树 1(主席树)

    Description 给定一个长度为 \(n\) 的序列, \(m\) 次操作静态查询区间第 \(k\) 大 Input 第一行是 \(n,m\) 下一行描述这个序列 下面 \(m\) 行描述操作 ...

  3. 【莫队】【P3834】 【模板】可持久化线段树 1(主席树)

    大家好,我是个毒瘤,我非常喜欢暴力数据结构,于是我就用莫队+分块过了这个题 Solution 发现这个题静态查询资瓷离线,于是考虑莫队. 在这里简单介绍一下莫队: 将所有询问离线后,对原序列分块.按照 ...

  4. 题解 P3834 【【模板】可持久化线段树 1(主席树)】

    可持久化线段树的前置知识是权值线段树,但是你不学也没有太大的关系因为思想不是很难理解. 可持久化线段树支持历史记录查询,这是它赖以解题的方法. 在本题中思路是建立n颗线段树,然后对于每次询问,考虑其中 ...

  5. LuoguP3834 【模板】可持久化线段树 1(主席树)|| 离散化

    题目:[模板]可持久化线段树 1(主席树) 不知道说啥. #include<cstdio> #include<cstring> #include<iostream> ...

  6. 洛谷P3834【模板】可持久化线段树 1(主席树)

    题目背景 这是个非常经典的主席树入门题--静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 输入输 ...

  7. 【刷题】洛谷 P3834 【模板】可持久化线段树 1(主席树)

    题目背景 这是个非常经典的主席树入门题--静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 输入输 ...

  8. luogu P3834 【模板】可持久化线段树 1(主席树) 查询区间 [l, r] 内的第 k 小/大值

    ————————————————版权声明:本文为CSDN博主「ModestCoder_」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.原文链接:https:// ...

  9. 洛谷P3178 [HAOI2015]树上操作(dfs序+线段树)

    P3178 [HAOI2015]树上操作 题目链接:https://www.luogu.org/problemnew/show/P3178 题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边 ...

随机推荐

  1. 大数据学习之路之ambari配置(四)

    试了很多遍,内存还是不够,电脑不太行的,不建议用ambari!!! 放弃了

  2. 微信支付之微信H5支付(坑,ajax不支持重定向跳转)

    这里讲的是  微信h5支付,    是微信以外的手机浏览器调用微信h5支付  h5支付: H5支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认使用微信支付时,商户发起本服务呼起 ...

  3. QGIS源码编译步骤详解——官方新方案

    目录 源码下载 环境下载 Cygwin64 OSGeo4W CMAKE Visual Studio 2017 环境配置 配置 编译   方案详细可见源码文件中INSTALL.md. 源码下载   QG ...

  4. Java重载容易引发的错误—返回类型

    方法的签名仅仅与方法名和参数类型相关,而与访问控制符.返回类型无关,以及方法体中的内容都没有关系,下面用一个例子说明; 如果Student类两种签名,myStudent(int,int)返回int 类 ...

  5. 踩了个DNS解析的坑,但我还是没想通

    hello大家好,我是小楼. 最近踩了个DNS解析的小坑,虽然问题解决了,但排查过程比较曲折,最后还是有一点没有想通,整个过程分享给大家. 背景 最近负责的服务要置换机器.置换机器可能很多小伙伴不知道 ...

  6. linux 手动挂载硬盘没有移到回收站解决方法

    linux 手动挂载硬盘没有移到回收站解决方法 修改挂载硬盘的文件夹权限为当前用户即可 或者 修改读写权限 chmod 777 mount-disk-path

  7. mosquitto服务器的安装以及mqtt.fx软件的使用

    一.MQTT描述 MQTT 全称为 Message Queuing Telemetry Transport(消息队列遥测传输)是一种基于发布/订阅范式的"轻量级"消息协议,由 IB ...

  8. ArcGIS建筑物简化和建筑物群聚合算法实验

    一.下载OSM数据 首先从OpenStreetMap官网下载我们需要的实验数据,这里我选择清华和北大校园作为本次实验数据 二.数据处理 将我们下载的实验数据导入ArcGIS.由于OSM数据是.osm格 ...

  9. 一次不规范HTTP请求引发的nginx响应400问题分析与解决

    背景 最近分析数据偶然发现nginx log中有一批用户所有的HTTP POST log上报请求均返回400,没有任何200成功记录,由于只占整体请求的不到0.5%,所以之前也一直没有触发监控报警,而 ...

  10. 关于JS精度缺失问题

    问题描述 在Java后端传一个比较大的Long值的时候 前端接收值的时候会出现精度的缺失: 解决办法 添加一个转换类 点击查看代码 public class JacksonObjectMapper e ...