[poj2104]kth-number(归并树求区间第k大)
2024-10-21 20:27:24
复杂度:$O(nlog^3n)$
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<cmath>
#define MAXN 100000
using namespace std;
int sorted[][MAXN],a[MAXN];
void build(int deep,int l,int r){
if(l==r){
sorted[deep][l]=a[l];
return;
}
int mid=(l+r)>>;
build(deep+,l,mid);
build(deep+,mid+,r);
int p=l,q=mid+,k=l;
while(p<=mid&&q<=r){
if(sorted[deep+][p]<=sorted[deep+][q])
sorted[deep][k++]=sorted[deep+][p++];
else sorted[deep][k++]=sorted[deep+][q++];
}
while(p<=mid) sorted[deep][k++]=sorted[deep+][p++];
while(q<=r) sorted[deep][k++]=sorted[deep+][q++];//存储序列
}
//查询某个数在区间内的rank
int query(int deep,int l,int r,int tl,int tr,int k){
if(tr<l||tl>r) return ;
if(tl<=l&&r<=tr)
return lower_bound(&sorted[deep][l],&sorted[deep][r]+,k)-&sorted[deep][l];
int mid=(l+r)>>;
return query(deep+,l,mid,tl,tr,k)+query(deep+,mid+,r,tl,tr,k);
} int solve(int n,int tl, int tr, int k){
int l=,r=n;
while(l<r){
int mid=(l+r+)>>;
int cnt=query(,,n,tl,tr,sorted[][mid]);
if(cnt<=k) l=mid;
else r=mid-;
}
return sorted[][l];
} int main(){
int n,m;
scanf("%d%d", &n, &m);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
build(,,n);
while(m--){
int tl,tr,k;
scanf("%d%d%d", &tl, &tr, &k);
printf("%d\n", solve(n,tl,tr,k-));
}
return ;
}
最新文章
- 我们为什么要配置CATALINA_HOME环境变量
- 【OpenCV】选择ROI区域
- JavaScript表单提交四种方式
- Spring MVC 入门教程示例 (一)
- 20160204.CCPP体系详解(0014天)
- bnuoj 1053 EASY Problem (计算几何)
- SQL rank() 用法
- Morgan stanley 电话面试
- Linux常用操作命令(一)
- IDEA 2017注册码破解方法(转)
- c与c++d的typedef
- JavaScript 基础学习1-day14
- 半径无关快速高斯模糊实现(附完整C代码)
- Android-XML
- Linux DNS 服务器安装、配置和维护
- k8s部署kafka集群
- Hibernate 配置文件hibernate.cfg.xml的详细
- OOm是否可以try catch ?
- 【PAT】B1077 互评成绩计算(20 分)
- 把springboot的项目打包运行指南