博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
主席树K-th Number
阅读量:6258 次
发布时间:2019-06-22

本文共 2594 字,大约阅读时间需要 8 分钟。

/*K-th Number

Time Limit: 20000MS Memory Limit: 65536K
Total Submissions: 44535 Accepted: 14779
Case Time Limit: 2000MS
Description

You are working for Macrohard company in data structures department. After failing your previous task about key insertion you were asked to write a new data structure that would be able to return quickly k-th order statistics in the array segment.

That is, given an array a[1...n] of different integer numbers, your program must answer a series of questions Q(i, j, k) in the form: "What would be the k-th number in a[i...j] segment, if this segment was sorted?"
For example, consider the array a = (1, 5, 2, 6, 3, 7, 4). Let the question be Q(2, 5, 3). The segment a[2...5] is (5, 2, 6, 3). If we sort this segment, we get (2, 3, 5, 6), the third number is 5, and therefore the answer to the question is 5.
Input

The first line of the input file contains n --- the size of the array, and m --- the number of questions to answer (1 <= n <= 100 000, 1 <= m <= 5 000).

The second line contains n different integer numbers not exceeding 109 by their absolute values --- the array for which the answers should be given.
The following m lines contain question descriptions, each description consists of three numbers: i, j, and k (1 <= i <= j <= n, 1 <= k <= j - i + 1) and represents the question Q(i, j, k).
Output

For each question output the answer to it --- the k-th number in sorted a[i...j] segment.

Sample Input

7 3

1 5 2 6 3 7 4
2 5 3
4 4 1
1 7 3
Sample Output

5

6
3*/
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int ls[8000008],rs[8000008],sum[8000008],root[100008],num[100009],n,m,hash[100009];
int tmp,size,a[100008];
void jia(int l,int r,int x,int &y,int v)
{
y=++size;
sum[y]=sum[x]+1;
if(l==r)
return;
ls[y]=ls[x];
rs[y]=rs[x];
int mid=(l+r)>>1;
if(v<=mid)
jia(l,mid,ls[x],ls[y],v);
else
jia(mid+1,r,rs[x],rs[y],v);
return;
}
int xun(int L,int R,int V)
{
int x=root[L-1],y=root[R],l=1,r=tmp,mid=(l+r)/2;
for(;l!=r;)
if(sum[ls[y]]-sum[ls[x]]>=V)
{
x=ls[x];
y=ls[y];
r=mid;
mid=(l+r)>>1;
}
else
{
V-=sum[ls[y]]-sum[ls[x]];
x=rs[x];
y=rs[y];
l=mid+1;
mid=(l+r)>>1;
}
return l;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n; i++)
{
scanf("%d",&num[i]);
a[i+1]=num[i];
}
sort(num,num+n);
hash[++tmp]=num[0];
for(int i=1;i<n;i++)
if(hash[tmp]!=num[i])
hash[++tmp]=num[i];
for(int i=1;i<=n;i++)
jia(1,tmp,root[i-1],root[i],lower_bound(hash+1,hash+n+1,a[i])-hash);
for(int i=0;i<m;i++)
{
int l,r,v;
scanf("%d%d%d",&l,&r,&v);
printf("%d\n",hash[xun(l,r,v)]);
}
return 0;
}

转载于:https://www.cnblogs.com/xydddd/p/5144142.html

你可能感兴趣的文章
php的curl获取https加密协议请求返回json数据进行信息获取
查看>>
检查HP服务器硬盘状态脚本
查看>>
Java基础之函数
查看>>
NAT负载均衡_ftp
查看>>
kafka集群搭建
查看>>
Mongodb大数据语法大全
查看>>
Linux的简单SHELL
查看>>
bat清理日志文件
查看>>
python——“破解”私有属性
查看>>
httpclient请求域名自定义域名指向ip
查看>>
安装 MySQL报错 -bash: mysql: command not found
查看>>
RedHat6.4使用CentOS163yum源在线安装及更新软件
查看>>
BUG: soft lockup - CPU#0 stuck for 22s! [kworker/0:2:27076]
查看>>
亿美软通亮相亿邦未来零售大会,斩获智能商业创新奖
查看>>
sed awk 笔记(二)
查看>>
DOCKER 给运行中的容器添加映射端口
查看>>
linux |版权许可GNU和GPL
查看>>
System Center 2012 SP1 之四 配置App Controller
查看>>
第三篇 Python函数(day3)
查看>>
如何轻松快速搭建商城系统?
查看>>