首页 > 其他分享 >POJ2104-K-th Number(浅析主席树)

POJ2104-K-th Number(浅析主席树)

时间:2022-11-22 21:06:14浏览次数:81  
标签:return int segment tree Number th include root 浅析


K-th Number

Time Limit: 20000MS

 

Memory Limit: 65536K

Total Submissions: 65162

 

Accepted: 22979

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 10 9 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

Hint

This problem has huge input,so please use c-style input(scanf,printf),or you may got time limit exceed.

Source

​Northeastern Europe 2004​​, Northern Subregion

具体关于主席树戳​​这里​​。

Code:

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#define N 100005
using namespace std;
int cnt=1,rank[N],root[N];
struct node
{
int id,value;
}a[N];
struct tree
{
int l,r,sum;
tree()
{
sum=0;
}
}tree[20*N];
int cmp(node x,node y)
{
return x.value<y.value;
}
void update(int num,int &rt,int l,int r)
{
tree[cnt++]=tree[rt];
rt=cnt-1;
tree[rt].sum++;
if(l==r)return;
int mid=(l+r)>>1;
if(num<=mid)update(num,tree[rt].l,l,mid);
else update(num,tree[rt].r,mid+1,r);
}
int query(int i,int j,int k,int l,int r)
{
int d=tree[tree[j].l].sum-tree[tree[i].l].sum;
if(l==r)return l;
int mid=(l+r)>>1;
if(k<=d)return query(tree[i].l,tree[j].l,k,l,mid);
else return query(tree[i].r,tree[j].r,k-d,mid+1,r);
}
int main()
{
int n,T;
scanf("%d%d",&n,&T);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i].value);
a[i].id=i;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
rank[a[i].id]=i;
for(int i=1;i<=n;i++)
{
root[i]=root[i-1];
update(rank[i],root[i],1,n);
}
while(T--)
{
int l,r,k;
scanf("%d%d%d",&l,&r,&k);
printf("%d\n",a[query(root[l-1],root[r],k,1,n)].value);
}
return 0;
}

标签:return,int,segment,tree,Number,th,include,root,浅析
From: https://blog.51cto.com/u_15888102/5878471

相关文章

  • 浅析树链剖分
    可以看出树链剖分的作用就是将一棵树变成一个可处理的dfs序,树上操作一般由​​线段树​​来维护,看一下模板题​​BZOJ1036​​和​​POJ3237​​。......
  • Codeforces897B-Chtholly's request
    B.Chtholly'srequesttimelimitpertestmemorylimitpertestinputoutput—Thanksalotfortoday.—Iexperien......
  • linux下通过rpath解决cmake动态编译后找不到动态链接库问题
    通过cmake编译链接动态库后,会有一个问题,那就是需要的.so文件不能更改目录,一旦.so文件目录变了,整个程序就没法运行了,这肯定是不行的。原因后来我查一下一下,linux系统中,......
  • Linux C编程 使用相对路径加载动态库-rpath和$ORIGIN
    商业程序如何加载自己的so使用LD_LIBRARY_PATH的缺点是要实现设置LD_LIBRARY_PATH。不够自动化。那么大型的商业程序是如何加载自己的so呢。这里以QtCreator为例。QtC......
  • Codeforces875B-Sorting the Coins
    SortingtheCoinsRecently,DimametwithSashainaphilatelicstore,andsincethentheyarecollectingcoinstogether.Theirfavoriteoccupationistosortco......
  • JiLi Number
    ProblemK.JiLiNumberDescriptionDriverJilikesthedigit"1".Hehasanaccumulatorwhichshowsthesumofinputnumber.Helistsallofpositivenumbernomore......
  • Codeforces862A-Mahmoud and Ehab and the MEX
    MahmoudandEhabandtheMEXDr.EvilkidnappedMahmoudandEhabintheevillandbecauseoftheirperformanceintheEvilOlympiadinInformatics(EOI).Hedeci......
  • Codeforces867B-Save the problem!
    Savetheproblem!Attention:welostallthetestcasesforthisproblem,soinsteadofsolvingtheproblem,weneedyoutogeneratetestcases.We'regoing......
  • Python中除了lambda函数能实现一句话程序,还有什么方式能够实现呢?
    引言我们都知道python中使用lambda函数能够实现一句话程序,一句话能实现复杂功能,是一件多么炫酷的事情.但也是有利有弊的,至少一句话代码虽然简洁,但可读性不好,毕竟现实中......
  • Python 命令行参数
    Python命令行参数参考文章:https://zhuanlan.zhihu.com/p/56922793目标:编写出可执行参数的脚本文件并打包;1.sys模块方法使用sys.argv获取执行参数;"""开发终端参......