【JZOJ3379】查询【主席树】

可持久化线段树(主席树) 摘要 主席树,又称可持久化线段树,属于可持久化数据结构。“主席”这一名词是由于发明者缩写为HJT,和某位主席拼音缩写相同(有些牵强),故将该数据结构称为主席树。 主席树既保留了线段树的灵活,也拥有了可持久化数据结构的特点,在处理某些特定问题时有着其它数据结构不具有的优势。 本文将首先介绍什么是“可持久化数据结构”,随后介绍主席树的思想,关于代码实现将结合例题讲解。 可持久化数据结构 可持久数据结构... 阅读详情

题目大意:

题目链接:https://jzoj.net/senior/#main/show/3379

考虑带重复数的集合。定义在该类集合上的并操作“+”为两个集合的所有数不剔除重复得到的结果。比如,若 A = 1 , 2 , 2 , 3 A={1,2,2,3} A=1,2,2,3, B = 2 , 3 , 4 , 4 B={2,3,4,4} B=2,3,4,4,则 C = 1 , 2 , 2 , 2 , 3 , 3 , 4 , 4 C={1,2,2,2,3,3,4,4} C=1,2,2,2,3,3,4,4。
对于一个给定序列 A [ 1.. N ] A[1..N] A[1..N],定义 A [ x . . y ] A[x..y] A[x..y]为包含 y − x + 1 y-x+1 y−x+1个元素的集合 A [ x ] , A [ x + 1 ] , … , A [ y ] {A[x],A[x+1],…,A[y]} A[x],A[x+1],…,A[y]。现在,给定整数序列 A A A,你需要回答很多询问,其中第 i i i个询问要求集合 A [ x [ i , 1 ] . . y [ i , 1 ] ] + A [ x [ i , 2 ] . . y [ i , 2 ] ] + … + A [ x [ i , k i ] . . y [ i , k i ] ] A[x[i,1]..y[i,1]]+A[x[i,2]..y[i,2]]+…+A[x[i,ki]..y[i,ki]] A[x[i,1]..y[i,1]]+A[x[i,2]..y[i,2]]+…+A[x[i,ki]..y[i,ki]]中第 p i p_i pi​小的元素。


思路:

如果是单独一个区间询问第 k k k小,那么就是裸的主席树。
题目中说区间的个数不会超过5,那么我们可以在每次询问时把这5个区间的答案全部加上。这样就完成了。同时也保证了一个数字可以重复。
具体的说,我们询问时把原来的两个主席树 n o w l , n o w r nowl,nowr nowl,nowr变成一个数组 n o w l [ 6 ] , n o w r [ 6 ] nowl[6],nowr[6] nowl[6],nowr[6],然后每次询问时把两个区间左子树的差值改成多个区间左子树的差值之和。
然后这样就是在普通主席树上乘上了一个常数5。
时间复杂度 O ( m log ⁡ n ) O(m\log n) O(mlogn)


代码:

#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;

const int N=200010;
int n,Q,m,k,tot,a[N],b[N],root[N],L[6],R[6];

struct Tree
{
	int lc,rc,cnt;
}tree[N*22];

int read()
{
	int d=0;
	char ch=getchar();
	while (!isdigit(ch)) ch=getchar();
	while (isdigit(ch))
		d=(d<<3)+(d<<1)+ch-48,ch=getchar();
	return d;
}

int build(int l,int r)
{
	int p=++tot;
	if (l==r) return p;
	int mid=(l+r)>>1;
	tree[p].lc=build(l,mid);
	tree[p].rc=build(mid+1,r);
	return p;
}

int insert(int now,int l,int r,int x)
{
	int p=++tot;
	tree[p]=tree[now];
	tree[p].cnt++;
	if (l==r) return p;
	int mid=(l+r)>>1;
	if (x<=mid) tree[p].lc=insert(tree[now].lc,l,mid,x);
		else tree[p].rc=insert(tree[now].rc,mid+1,r,x);
	return p;
}

int ask(int nowl[],int nowr[],int l,int r,int k)
{
	if (l==r) return l;
	int mid=(l+r)>>1,s=0;
	for (int i=1;i<=m;i++)
		s+=tree[tree[nowr[i]].lc].cnt-tree[tree[nowl[i]].lc].cnt;
	if (s>=k)
	{
		for (int i=1;i<=m;i++)
		{
			nowl[i]=tree[nowl[i]].lc;
			nowr[i]=tree[nowr[i]].lc;
		}
		return ask(nowl,nowr,l,mid,k);
	} 
	else
	{
		for (int i=1;i<=m;i++)
		{
			nowl[i]=tree[nowl[i]].rc;
			nowr[i]=tree[nowr[i]].rc;
		}
		return ask(nowl,nowr,mid+1,r,k-s);
	}
}

int main()
{
	n=read(); Q=read();
	root[0]=build(1,n);
	for (int i=1;i<=n;i++)
		a[i]=b[i]=read();
	sort(b+1,b+1+n);
	int T=unique(b+1,b+1+n)-b-1;
	for (int i=1;i<=n;i++)
	{
		a[i]=lower_bound(b+1,b+1+T,a[i])-b;
		root[i]=insert(root[i-1],1,n,a[i]);
	}
	while (Q--)
	{
		m=read(); k=read();
		for (int i=1;i<=m;i++)
		{
			L[i]=read(); L[i]=root[L[i]-1];
			R[i]=read(); R[i]=root[R[i]];
		}
		printf("%d\n",b[ask(L,R,1,n,k)]);
	}
	return 0;
}
【JZOJ3379】查询 description 对于一个整数序列,查询区间第k大数可以在O(logN)的时间内轻松完成。现在我们对这个问题进行推广。 考虑带重复数的集合(multiset)。定义在该类集合上的并操作“+”为两个集合的所有数不剔除重复得到的结果。比如,若A={1,2,2,3},B={2,3,4,4},则C={1,2,2,2,3,3,4,4}。 对于一个给定序列A[1…N],定义A[x…y]为包含y-x+1个... 阅读详情

相关推荐

【学习笔记】浅谈主席树(可持久化线段树)

主席树上没有主席,就跟老婆饼里没有老婆,Bamboo_Day 里没有 Bamboo 是一样的。之所以叫主席树,是因为发明这个数据结构的人名字缩写为hjt跟某位伟大的主席一样。主席树是在的基础上发展出来的,所以你要先学会当然你还要学会。

菜狗成长为蒟蒻之路 1860

主席树详解(基础)

可持久化线段树,又称主席树,本文详解它的构成和基础用法

nxhx_的博客 4661

从实验室到生产线:Qwen3-Omni后训练技术在实际业务中的落地挑战

本文探讨了Qwen3-Omni后训练技术在实际业务中的落地挑战,重点分析了多模态AI在工业应用中的关键问题与解决方案。通过金融风控、跨境电商等场景案例,揭示了通用模型与垂直需求的矛盾,并提供了知识蒸馏、语音合成优化等实战经验,助力企业实现技术到业务的转化。

weixin_29035147的博客 267

主席树(POJ-2104、HDU-2665)

【算法分析】 主席树名称来源于其发明人黄嘉泰的姓名的首字母缩写HJT与我们某位主席姓名的首字母缩写一样。 主席树的经典应用在于求某个区间内的第K小/大数的值。比如区间第K大问题,就是给定一个数列a,询问给定区间[L,R]的第K大值。如对数列a=[4,1,3,2,5],针对询问L=2,R=5,K=2,其答案为2。 主席树是一种可持久化数据结构,即可持久化权值线段树。 为了实现可持久化,就要保存线...

hnjzsyjyj的专栏 3566

深入解析 ReDoc:从零构建高性能 API 文档的终极指南

ReDoc 是一个强大的开源工具,用于将 OpenAPI 规范转换为高质量、响应式的 API 文档。本文详细介绍了如何使用 ReDoc 构建和自定义 API 文档,包括如何编写支持 OpenAPI 的 API 注解、配置 HTML 页面以加载文档,以及如何利用 ReDoc 的高级功能进行定制。通过实例代码,您将学会如何灵活地展示 API 文档,提升用户体验。无论是初学者还是经验丰富的开发者,都能从本文中获得实用的技巧与方案,帮助快速搭建符合需求的 API 文档界面。

楠搏万的博客 4627

【可信数据空间-连接器技术架构设计方案】

一句话概括连接器是可信数据空间的“数据保镖”和“外交官”。连接器就是一个部署在你本地的软件代理,它代表你安全地对外提供数据服务,确保在共享数据价值的同时,牢牢守住数据的所有权和控制权。它是实现“数据可用不可见”这一理想的关键技术部件。一个生动的比喻:银行的金库和接待员想象一下,你的数据就是藏在银行金库里的黄金和钞票。金库(你的内部数据库): 绝对安全,外人绝对不能进。接待员(连接器): 坐在银行大厅里,负责与客户打交道。客户向接待员提出请求:“我想取1000元。

u014716614的博客 2270

可持久化数据结构-线段树(主席树)

可持久化线段树的概念和简单运用

zje11的博客 2741

RK3568(buildroot)利用squashfs+overlay实现嵌入式系统高可靠存储方案

本文详细介绍了在RK3568嵌入式平台上,基于Buildroot系统,利用squashfs只读根文件系统与overlayfs可写层相结合的高可靠存储方案。该方案能有效防止设备意外断电导致的系统文件损坏,通过内核配置、启动脚本编写及镜像制作,实现系统核心的只读保护与用户数据的持久化分离,显著提升嵌入式设备的现场稳定性。

weixin_29189381的博客 548

主席树简介及应用

【主席树简介】 主席树,即可持久化线段树,又称函数式线段树,是重要的可持久化数据结构之一。所谓可持久化,是指可以回溯到历史版本。 主席树的本质,就是在有数据更新时,在基准线段树的基础上采用“结点复用”的方式仅仅增加少量结点来维护历史数据,而不是通过存储不同版本线段树的方式来维护历史数据,从而达到减少时空消耗的目的,避免出现TLE(Time Limit Exceeded)及MLE(Memory Limit Exceeded)错误。主席树空间一般建议是开n<<5(n为基准线段树的结点数)。 如在..

hnjzsyjyj的专栏 3313

把 SAP 输出稳稳落到 PDF:从 SPAD 前端打印到 ABAP 程序级转换的一套方法

摘要:本文介绍了三种在SAP系统中将报表输出转为PDF文件的方法。路线A通过SPAD配置前端输出设备,结合Windows打印机设置实现用户交互式PDF保存;路线B在SP01事务码中将已有Spool请求另存为PDF,适用于补救导出;路线C通过ABAP程序自动转换Spool为PDF,适合批量处理。文章详细说明了配置步骤,并针对常见问题(如乱码、文件格式错误等)提供了排查思路。三种方案分别适用于不同场景,用户可根据实际需求选择最合适的PDF导出方式。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 221

图片风格自动分析模型

对于分类任务,我们可以使用交叉熵损失作为损失函数。同时,我们可以选择随机梯度下降(SGD)或Adam等优化器进行模型优化。# 使用SGD优化器# 或使用Adam优化器在这部分,总结整个项目的过程,包括数据准备、模型构建、训练、优化和评估等。同时,讨论可能的改进方向和未来工作,例如尝试更多的模型结构、优化技巧等。

a871923942的博客 1699

[jzoj 3379] 查询 {主席树}

题目 Description 对于一个整数序列,查询区间第k大数可以在O(logN)的时间内轻松完成。现在我们对这个问题进行推广。 考虑带重复数的集合(multiset)。定义在该类集合上的并操作“+”为两个集合的所有数不剔除重复得到的结果。比如,若A={1,2,2,3},B={2,3,4,4},则C={1,2,2,2,3,3,4,4}。 对于一个给定序列A[1…N],定义A[x…y]为包含y-x...

Nowed 283

论文翻译:2024 High-Confidence Computing A survey on large language model (LLM) security and privacy: The

大型语言模型(LLMs),如ChatGPT和Bard,已经彻底改变了自然语言理解和生成。它们具有深度语言理解能力、类似人类的文本生成能力、上下文意识和强大的问题解决技能,使它们在各个领域(例如搜索引擎、客户支持、翻译)中变得不可或缺。同时,LLMs也在安全领域获得了关注,揭示了安全漏洞并展示了它们在安全相关任务中的潜力。本文探讨了LLMs与安全性和隐私的交集。具体来说,我们研究了LLMs如何积极影响安全性和隐私,与它们使用相关的潜在风险和威胁,以及LLMs内部的固有漏洞。

CSPhD-winston的博客 1722

[主席树]JZOJ 3379 查询

Description 对于一个整数序列,查询区间第k大数可以在O(logN)的时间内轻松完成。现在我们对这个问题进行推广。考虑带重复数的集合(multiset)。定义在该类集合上的并操作“+”为两个集合的所有数不剔除重复得到的结果。比如,若A={1,2,2,3},B={2,3,4,4},则C={1,2,2,2,3,3,4,4}。对于一个给定序列A[1..N],定义A[x..y]为...

weixin_30824479的博客 98

从零构建Fama-French多因子模型:量化投资系统开发实战

本文详细介绍了如何从零构建Fama-French多因子模型,并将其应用于量化投资系统的开发。首先,文章概述了Fama-French多因子模型的背景、核心原理和架构,解释了其如何通过引入市场风险、规模、价值、盈利和投资等因子来解释股票收益率的变化。接着,文章详细阐述了构建该模型的具体步骤,包括因子的计算、因子暴露的确定以及模型的估计。通过数学模型和公式,文章对模型进行了理论推导,并举例说明了其应用。此外,文章还提供了项目实战的代码案例,从开发环境搭建到源代码实现,逐步指导读者完成量化投资系统的开发。最后,文章

2501_92132293的博客 1226

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

jzoj3379-查询【主席树】

正题 题目大意 给出一个有序集合AAA,定义Al,rA_{l,r}Al,r​表示集合内l∼rl\sim rl∼r这个范围内的数。 定义加法A+BA+BA+B表示两个集合中的所有元素(不去重)。 现在询问,每次询问ki,pik_i,p_iki​,pi​然后给出kik_iki​个区间[lj,rj][l_j,r_j][lj​,rj​] 求∑j=1kiAlj,rj\sum_{j=1}^{k_i} A_{...

QuantAsk 424

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【主席树】JZOJ_3379 查询

题意 查询区间第KKK大,不过是多个区间拼起来的区间。 思路 在普通区间第KKK大的问题中,我们只是做了一个区间,因为这里小区间的个数很小,所以我们可以直接暴力统计。 代码 #include<cstdio> #include<algorithm> struct node { int lc, rc, dat; }tree[6000001]; int nn, n, m, k...

GOODPLACE 297

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

JZOJ 3379. 【NOI2013模拟】查询【主席树】

...题目:题意:分析:代码: 题目: 传送门 题意: 问在原序列的基础上,有多个连续的数的集合向合并且有重复性,现在询问得到的新序列的第pip_ipi​小数 分析: 我们通过主席树来实现对新序列的O(logn)O(logn)O(logn)查询 因为数之间的差距太大,所以我们用离散化来使得程序可行 代码: #pragma GCC optimize("Ofast") #pragma GCC ...

qq_35786326的博客 210

JZOJ 3379. 【NOI2013模拟】查询

主席树+前缀和,听说正解是Trie?

Ajwallet 419

欢乐纪中某A组赛【2019.7.10】

前言 好烦我最后写对了T1T1T1的808080分结果交错题导致T2T2T2的404040分没了T1T1T1也没拿多那些分。 话说好像ZDYZDYZDY比我还惨 成绩 这里还是按OJOJOJ上的分数排名 JJJ表示初中,HHH表示高中后面加的是几年级 RankRankRank PersonPersonPerson ScoreScoreScore AAA BBB CCC 333 ...

QuantAsk 537

2019.07.10【NOIP提高组】模拟 A 组

题目 [bzoj 3257][jzoj 3347] 树的难题 {拓扑排序+树形dp} 感觉早上就没有好好做比赛。

Nowed 365

主席树(可持久化线段树)

2019.11.4 今天总算弄会主席树了,发现确实不难,但是需要跳出常规线段树的思维,特别是处理子树上面 主席树的定义与作用 主席树,也称可持久化线段树,那么什么是可持久化线段树呢,即为一颗记录了所有更新过程的线段树。能够处理出从第i次更新到第j次更新的线段树变化,具体作用一会见例题。 主席树的功能 记录所有过程的线段树,按正常思维是需要开O(N*M)这么大的空间的,时间也为O(n*m),...

孙煜晗的博客 7009

关于主席树

什么是主席树? 主席树又叫做可持久化线段树,其实后者才是它的大名只是大家都图方便就叫前者了。 可持久化线段树,一听名字就知道它的两个终点:可持久化,线段树。 都要学主席树了,线段树是什么总归都知道的吧,那什么是可持久化呢? 可持久化理解起来其实也很简单,说白了就是可以查询历史节点就可以叫可持久化了,所以可持久化线段树的意思就是可以查询线段树的历史节点就是可持久化了。 如何实现可持久化? 我们这边先给出一棵线段树吧。 画的不好,大家理解一下就行了 假设说我现在想要单点修改最左边的叶子节点 在这里插入图片描述

two_big_monkey的博客 2141

主席树

抛出问题 给定\(N\)个数(\(int\)范围内),一共\(M\)次询问,每次都要询问区间\([l,r]\)的第\(k\)大的数。 其中\(N,M,l,r\)均不超过\(2\times 10^5\),保证询问有答案。 点我去模板题 解决问题 暴力法 显而易见,最暴力的办法就是区间排序然后输出排序后第\(k\)个数。最坏情况的时间复杂度是\(O(nm\lg n)\),不超时才怪。 主席树...

GKX328131442的博客 602
上一篇: 【JZOJ1782】Travel【分层图最短路】
下一篇: 【JZOJ3347】树的难题【树形dp】【拓扑排序】
stoorz1023
博客等级 码龄9年 101粉丝 595原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值