p3834&hdu2665 静态区间第k小 主席树(模板)

原题:https://www.luogu.org/problemnew/show/P3834

题解:求区间中第k小的元素。这里要用到主席树。主席树的思想是对数列的每一个前缀都建一个线段树。由于数据很大首先考虑离散化。在处理[l,r]的区间时,只要找到第l-1棵树和第r棵树,对应节点的差就是该询问对应区间信息。但由于这样做内存很大,我们考虑动态开点,只需要建一颗空树,开用到的点就行了,空间复杂度为O(N*log(N))。查询时只用判断第k小在左子树还是右子树就行了。

#include<bits/stdc++.h>
#define mid (l+r)/2
using namespace std;
const int N=220000;
const int Log=20; 
int sum[N*Log],T[N],L[N*Log],R[N*Log];
int n,q,m,a[N],b[N],tot;
inline int rd(){
	int x=0;int f=1;char s=getchar();
	while(!isdigit(s)) f=(s=='-'?-1:f),s=getchar();
	while(isdigit(s)) x=(x<<1)+(x<<3)+s-'0',s=getchar();
	return x*f;
}
inline int build(int l,int r){
	int rt=++tot;sum[rt]=0;
	if(l<r){
		L[rt]=build(l,mid);
		R[rt]=build(mid+1,r);
	} 

	return rt;
}
inline int update(int pre,int l,int r,int x){
	int rt=++tot;
	L[rt]=L[pre];R[rt]=R[pre];sum[rt]=sum[pre]+1;
	if(l<r){
		if(x<=mid) L[rt]=update(L[pre],l,mid,x);
		else       R[rt]=update(R[pre],mid+1,r,x);
	}
	return rt;
} 
inline int query(int u,int v,int l,int r,int k){
	if(l>=r) return l;
	int 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(){
//	freopen("p3834.in","r",stdin);
	n=rd();q=rd();
	for(int i=1;i<=n;i++) b[i]=a[i]=rd();

	sort(a+1,a+n+1);
	m=unique(a+1,a+n+1)-(a+1);
	
	tot=0;T[0]=build(1,m);//建空树 
	
	for(int i=1;i<=n;i++) {
		int t=lower_bound(a+1,a+m+1,b[i])-a;
		T[i]=update(T[i-1],1,m,t); 
	}
	for(int i=1;i<=q;i++){
		int x=rd();int y=rd();int k=rd();
		int p=query(T[x-1],T[y],1,m,k);
		printf("%d\n",a[p]);
	}
	return 0;
} 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值