【模板】可持久化线段树 2(主席树)

P3834 【模板】可持久化线段树 2(主席树) 题目链接 静态查询区间第k小问题。 我们可以先联想权值线段树查询[1,n]整体区间第k小问题的思路: 权值线段树本质是一个桶,左子区间桶内的数大于等于k就递归给左子树查询,否则递归给右子树查询第k-tree[ lc[rt] ]小的值 。 虽然这题是查询[l,r]区间第k小,但是我们可以转化成整体区间第k小问题: 由于数据范围太大,我们先把数据离散化,对离散化后的数组的每个前缀建线段树,维护离散化数组中的数在原数组中出现的次数之和。(本质就是个桶) 那么[l,r]区间内的第k小值就等于 :[1,r]区间对 阅读详情
题目链接https://www.luogu.com.cn/problem/P3834
代码
#include<iostream>
#include<string>
#include<map>
#include<set>
//#include<unordered_map>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<stack>
#include<cmath>
#include<fstream>
#define X first
#define Y second
#define best 131 
#define INF 0x3f3f3f3f
#define P pair<int,int>
#define ls p<<1
#define rs p<<1|1
//#define int long long
//#define int long long
//const ll lnf=0x3f3f3f3f3f3f3f3f;
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const double eps=1e-5;
const double pai=acos(-1.0);
const int N=2e5+10;
const int maxn=1e6+10;
const int mod=1000000007;
//const int d[4][2]={0,1,1,0,-1,0,0,-1};
//int day[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};
int n,q,m,cnt=0;
int a[N],b[N],root[N];
int sum[N<<5],L[N<<5],R[N<<5];
inline void build(int p,int l, int r)
{
        p=++cnt,sum[p]=0;
	if(l==r) return;
	int mid=(l+r)>>1;
	build(L[p],l,mid); 
	build(R[p],mid+1,r);
}
inline int update(int p,int l,int r,int pos)
{
    int rt=++cnt;
    L[rt]=L[p],R[rt]=R[p];sum[rt]=sum[p]+1;
    if(l<r) 
    {
		int mid=(l+r)>>1;
        if(pos<=mid) L[rt]=update(L[p],l,mid,pos);
        else R[rt]=update(R[p],mid+1,r,pos);
    }
    return rt;
}
inline int query(int u, int v, int l, int r, int k)
{
    if(l>=r) return l;
    int mid=(l+r)>>1,x=sum[L[v]]-sum[L[u]];
    if(x>=k) return query(L[u],L[v],l,mid,k);
    else return query(R[u],R[v],mid+1,r,k-x);
}
int main()
{
    scanf("%d%d",&n,&q);
    for (int i=1;i<=n;i++)   
    {
        scanf("%d",&a[i]);
        b[i]=a[i];
    }
    sort(b+1,b+1+n);
    int len=unique(b+1,b+1+n)-b-1;
    build(root[0],1,len);
    for(int i=1;i<=n;i++)  
    {
        int pos=lower_bound(b+1,b+1+len,a[i])-b;
        root[i]=update(root[i-1],1,len,pos);
    }
    while(q--)
    {
        int l,r,k;
        scanf("%d%d%d",&l,&r,&k);
        int pos=query(root[l-1],root[r],1,len,k);
        printf("%d\n",b[pos]);
    }
    return 0;
}
解题报告:P3834 【模板】可持久化线段树 2(主席树)详解 P3834 【模板】可持久化线段树 1(主席树) 题解 P3834 【【模板】可持久化线段树 1(主席树)】 #include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #include<queue> #include<math.h>... 阅读详情

相关推荐

【主席树】【模板】【Luogu P3834】可持久化线段树2

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

blog 332

P3834 【模板】可持久化线段树 2

用前缀和的思想是因为前面记录的久结点而后面开辟的结点的值之间的差值是新添加的多少个结点。区间[L,R]包含的元素等于区间[1,R]减去区间[1,L-1]。可持久线段树是基本线段树的一个简单扩展,它的特点是支持查询历史版本,并且利用历史版本之间的共用数据减少时间和空间的消耗。如题,给定 n 个整数构成的序列 a,将对于指定的闭区间 [l,r] 查询其区间内的第 k 小值。我们在记录权值线段树时,不可能每次都开一颗全新的树进行记录其结点的值。它包含的思想有前缀和思想,共用点,离散化,权值线段树,动态开点。

zhi6fui的博客 382

EGO-Planner文章解读(一)——论文原理和算法实现

详细解读egoplanner论文和代码

fegxg的博客 3986

可持久化线段树2

可持久化线段树 2 题目描述 洛谷P3834 可持久化线段树 2 核心思路 这题可以使用可持久化权值线段树来实现,也就是主席树来实现。 主席树是一种可持久化的数据结构——可持久化权值线段树(因为其有函数的性质也叫函数式线段树) 可持久化就是有多个版本。但是我们考虑一下,如果对于每个版本都新建一个线段树,那么空间复杂度就会爆炸。可以发现,两版本之间有很多的相同之处,如果能利用上这些相同的部分,那么就可以节省很大一部分空间。 我们可以在构建新版本的线段树的时候,把没有变动的部分连回到上一个版本的那个部分上

qq_45832461的博客 434

智驾域控制器硬件架构:从接口丛林到算力核心的工程解码

本文深入解析了智驾域控制器硬件架构的设计挑战与工程实践。面对复杂的接口丛林,文章详细探讨了如何高效融合摄像头、雷达等多源传感器数据,并构建以多SOC为核心的强大算力平台。同时,文章强调了电源、时钟、散热等最小系统及车规级可靠性设计的关键作用,为工程师提供了从接口驯服到算力核心协同的完整硬件解码指南。

happy2的博客 482

FreeModbus源码详解

本篇按照FreeModbus协议栈的工作流程,对源代码进行总结解析;FreeModbus协议栈作为从机,等待主机传送的数据,当从机接收到一帧完整的报文后,对报文进行解析,然后响应主机,发送报文给主机,实现主机和从机之间的通信; 1:demo.c中三个函数,完成协议栈的准备工作; eMBInit()函数:(mb.c) /*函数功能: *1:实现RTU模式和ASCALL模式的协议栈初始化; *2

2万+

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

洛谷 P3834 【模板】可持久化线段树 2(主席树) 题目链接 题目背景 这是个非常经典的主席树入门题——静态区间第 k 小。 数据已经过加强,请使用主席树。同时请注意常数优化。 题目描述 如题,给定 n 个整数构成的序列 a,将对于指定的闭区间 [l, r] 查询其区间内的第 k 小值。 输入格式 第一行包含两个整数,分别表示序列的长度 n 和查询的个数 m。 第二行包含 n 个整数,第 i 个整数表示序列的第 ii 个元素 aia_iai​ 。 接下来 m 行每行包含三个整数 l,r,k,l, r,

旺崽的博客 2732

DCDC: 前馈电容优化环路稳定性的设计与验证方法

本文深入探讨了DCDC转换器中前馈电容对环路稳定性的优化设计与验证方法。通过分析前馈电容的作用原理、选型计算和实验验证,详细介绍了如何利用穿越频率和相位裕度等关键参数提升系统性能。文章还提供了实用的设计经验和问题排查技巧,帮助工程师在实际应用中实现DCDC转换器的最佳稳定性。

weixin_42531516的博客 438

P3834 【模板】可持久化线段树 2(整体二分做法)

P3834 【模板】可持久化线段树 2(主席树) 我们详细讲讲这个整体二分如何求区间第k值 我们都知道二分可以求出区间里某个想要的值,如果有很多询问,我们对每个询问都进行二分,复杂度就是O(QNlog(1e9))铁超,那怎么优化呢? 我们先看第一个图 对于7个数的区间[1,5,2,6,3,7,4],我们有两个询问,[2,5]的第3大值,[4,4]的第1大值 我们先对区间[2,5]进行二分,会得到: [1,7] mid=4 n=2<3,(这里3是我们要求的第三大数,2指的是区间[2,5]内<=mi

qq_35975367的博客 517

运放比较电路分析以及应用

摘要:本文介绍了基于LM321运放的同相输入型单限电压比较器电路。该电路通过运放开环工作模式实现电平判断:当输入信号Vs+>0V时输出+15V高电平,Vs+<0V时输出≈0V低电平。典型应用包括直流电压过零检测、交流信号整形、电池欠压报警和数字信号噪声过滤。电路具有结构简单(仅需1个运放和1个电阻)、成本低的优势,适用于传感器信号处理、波形转换等场景。使用时需注意参考电平调整、输出电平匹配等问题,如需抗噪声可增加正反馈电阻构成施密特触发器。该电路是运放实现简单电平逻辑的经典方案。

qq_37999850的博客 395

手把手教你学BSP(11.3)--BSP实例:基于Raspberry Pi 4 Model B的Linux BSP开发实例

通过以上步骤,我们完成了一个基于Raspberry Pi 4 Model B的Linux BSP开发过程,包括硬件初始化、设备驱动编写、Bootloader配置、内核配置和编译,以及最终映像的生成。每个步骤都非常重要,确保每一步都正确无误才能使整个系统正常运行。

MHD0815的博客 1010

【模板】可持久化线段树 2(主席树) 主席树模板

大半年没用过主席树了,手敲回顾下,20min手敲1A主席树模板。。 我感觉我线段树这一块拿捏的死死的!! 很easy #include <bits/stdc++.h> using namespace std; typedef long long ll; const int M = 2e5+7; int a[M],li[M],cnt=0; int rt[M*20],ls[M*20],rs[M*20],tr[M*20]; void up(int pre,int &o,int l,in

bjfu170203101的博客 247

广州吉欧电子科技有限公司安卓开发工程师岗位 - 技术核心、职责详解与面试指南

广州吉欧电子科技有限公司招聘安卓开发工程师,该岗位可接收优秀应届生。岗位职责包括:1)负责安卓应用架构设计与开发,确保稳定性和可扩展性;2)功能模块编码实现与测试;3)性能优化与用户体验提升;4)后端接口对接;5)系统版本适配;6)用户反馈处理迭代;7)特殊要求熟悉RTK高精度定位技术原理及使用。该岗位要求扎实的安卓开发技术、良好的架构设计能力、性能优化经验,以及特定领域的RTK专业知识,是一个技术全面且具有专业特色的开发岗位。

郑伟强dev的专栏 153

LG·可持久化线段树 2【模板】【主席树】

luogu P3834 【模板】可持久化线段树 2(主席树)Description--Input--Output--Sample Input--Sample Output--说明--解题思路--代码-- Description– 静态区间第 kkk 小。 如题,给定 nnn 个整数构成的序列 aaa,将对于指定的闭区间 [l,r][l, r][l,r] 查询其区间内的第 kkk 小值。 linklinklink Input– 第一行包含两个整数,分别表示序列的长度 nnn 和查询的个数 mmm。 第二行包

ヽ(o_ _)o 185

扣子Coze工作流教程:采集公众号爆文,一键仿写自动发布

通过本教程,你学会了如何利用扣子(Coze)平台构建一个完整的公众号文章自动处理工作流。这个系统不仅能够大幅提升内容产出效率,还能通过AI二创保持内容新鲜度和原创性。最佳实践建议:初次使用时,建议先保存为草稿而不是直接发布,以便人工审核;从简单的工作流开始,逐步增加复杂度;定期检查工作流运行日志,优化节点配置。自动化内容创作是新媒体运营的未来趋势,掌握这项技能将使你在数字内容领域占据显著优势。

互联网架构师笔记 1238

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

P3834 【模板】可持久化线段树 2(主席树)[模板]

主席树学习链接:https://blog.youkuaiyun.com/weixin_43914593/article/details/108861279#comments_13569118 静态区间第k小板子: #include<iostream> #include<vector> #include<queue> #include<cstring> #include<cmath> #include<map> #include<set&

代码笔记本 285

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

可持久化线段树 2【模板】【主席树】

主席树解决区间第k小

//(^ o ^)// 177

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【Luogu3834】【模板】可持久化线段树 2(主席树)

[Link\frak{Link}Link] 求区间 kth 显然可以离散化权值,对每个位置用树维护此前每个权值的出现次数, 于是树上可以查询得到一定范围内所有权值的出现次数和 把这些树合并一下就可以了。。得到一个朝下散开的分叉拖把头 查询的时候在 L-1 和 R 两个版本上同时跑,根据相减结果导航到区间 kth 的位置上 O(mlog⁡n)O(m\log n)O(mlogn) ...

最后一次修改 231

洛谷P3834 【模板】可持久化线段树 2 【主席树】

题目链接 题意: 查询区间第 kkk 小 题解: 主席树的模板题 #include<iostream> #include<sstream> #include<string> #include<queue> #include<map> #include<unordered_map> #include<set> #include<vector> #include<stack> #include <u

qq_50554695的博客 187

【luogu3834】【模板】可持久化线段树 2(主席树),静态区间第K小值

problem solution 题目:有n个数,多次询问一个区间[L,R]中第k小的值是多少。 思路: 查询[1,n]中的第k小值: 先对数据进行离散化,然后按值域建立线段树,线段树中维护某个值域中的元素个数, 在线段树的 每个结点上记录这一个值域中的元素个数 , 那么要寻找第k小值,从根结点开始处理,若左儿子中表示的元素个数大于等于k,那么我们递归的处理左儿子,寻找左儿子中第k小的数,若左儿子中的元素个数小于k,那么第k小的数在右儿子中,我们寻找右儿子中第k-(左儿子中的元素数)小的数。 查询

小哈里的博客 815

luogu P3834 【模板】可持久化线段树 2(主席树)

///#pragma GCC optimize(2) #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<ll, ll>PLL; typedef pair<int, int>PII; typedef pair<double, double>PDD; #define I_int ll inli

我们都有光明的未来 227
上一篇: 【模板】可持久化线段树 1(可持久化数组)
下一篇: Rescue The Princess(数学)
Cosmic_Tree
博客等级 码龄7年 134粉丝 337原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值