K-th Number
Time Limit: 20000MS   Memory Limit: 65536K
Total Submissions: 52348   Accepted: 17985
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

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
 
 
思路:
  可持久化线段树模板;
 
来,上代码:
  结构体数组版(ac):

#include <cstdio>
#include <algorithm> using namespace std; struct TreeNode {
int l,r,dis;
}; class PersistentLineSegmentTree {
private:
int n,m,if_z,tot,num[],num_[],size; char Cget; TreeNode root[],node[*]; inline void read_int(int &now_)
{
now_=,if_z=,Cget=getchar();
while(Cget>''||Cget<'')
{
if(Cget=='-') if_z=-;
Cget=getchar();
}
while(Cget>=''&&Cget<='')
{
now_=now_*+Cget-'';
Cget=getchar();
}
now_*=if_z;
} public:
PersistentLineSegmentTree()
{
read_int(n),read_int(m);
for(int i=;i<=n;i++)
{
read_int(num[i]);
num_[i]=num[i];
}
sort(num+,num+n+);
size=unique(num+,num+n+)-num-;
Build(,size,root[]);
for(int i=;i<=n;i++)
{
num_[i]=lower_bound(num+,num+size+,num_[i])-num;
Down(,size,root[i-],root[i],num_[i]);
}
int lit,rit,k;
for(int i=;i<=m;i++)
{
read_int(lit),read_int(rit),read_int(k);
printf("%d\n",num[Query(,size,root[lit-],root[rit],k)]);
}
} inline void Up(TreeNode &now)
{
now.dis=node[now.l].dis+node[now.r].dis;
} void Build(int l,int r,TreeNode &now)
{
if(l==r) return ;
int mid=(l+r)>>;
now.l=++tot;
Build(l,mid,node[now.l]);
now.r=++tot;
Build(mid+,r,node[now.r]);
} void Down(int l,int r,TreeNode &pre,TreeNode &now,int to)
{
if(l==r)
{
now.dis++;
return ;
}
int mid=(l+r)>>;
if(to>mid)
{
now.l=pre.l;
now.r=++tot;
Down(mid+,r,node[pre.r],node[now.r],to);
}
else
{
now.r=pre.r;
now.l=++tot;
Down(l,mid,node[pre.l],node[now.l],to);
}
Up(now);
} int Query(int l,int r,TreeNode &pre,TreeNode &suc,int K)
{
if(l==r)
{
return l;
}
int mid=(l+r)>>;
int dis=node[suc.l].dis-node[pre.l].dis;
if(K>dis) return Query(mid+,r,node[pre.r],node[suc.r],K-dis);
else return Query(l,mid,node[pre.l],node[suc.l],K);
}
}; class PersistentLineSegmentTree tree; int main()
{
return ;
}

指针版(正确但超时):

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; struct TreeNode {
int l,r,mid,dis; TreeNode *left,*right;
}; class PersistentLineSegmentTree {
private:
int n,m,if_z,num[],num_[],size; char Cget; TreeNode *root[],*null; inline void read_int(int &now_)
{
now_=,if_z=,Cget=getchar();
while(Cget>''||Cget<'')
{
if(Cget=='-') if_z=-;
Cget=getchar();
}
while(Cget>=''&&Cget<='')
{
now_=now_*+Cget-'';
Cget=getchar();
}
now_*=if_z;
} public:
PersistentLineSegmentTree()
{
null=new TreeNode;
null->left=null;
null->right=null;
root[]=null;
read_int(n),read_int(m);
for(int i=;i<=n;i++)
{
read_int(num[i]);
num_[i]=num[i];
root[i]=null;
}
sort(num+,num+n+);
size=unique(num+,num+n+)-num-;
Build(root[],,size);
for(int i=;i<=n;i++)
{
num_[i]=lower_bound(num+,num+size+,num_[i])-num;
Down(root[i-],root[i],num_[i]);
}
int lit,rit,k;
for(int i=;i<=m;i++)
{
read_int(lit),read_int(rit),read_int(k);
printf("%d\n",num[Query(root[lit-],root[rit],k)]);
}
} void Build(TreeNode *&now,int l,int r)
{
if(now==null)
{
now=new TreeNode;
now->l=l;
now->r=r;
now->dis=;
now->mid=(l+r)>>;
now->left=null;
now->right=null;
}
if(l==r) return ;
Build(now->left,l,now->mid);
Build(now->right,now->mid+,r);
} inline void Up(TreeNode *&now)
{
now->dis=now->left->dis+now->right->dis;
} void Down(TreeNode *&pre,TreeNode *&now,int to)
{
now=new TreeNode;
now->l=pre->l;
now->r=pre->r;
now->mid=pre->mid;
now->left=null;
now->right=null;
if(now->l==now->r)
{
now->dis=pre->dis+;
return ;
}
if(to>now->mid)
{
now->left=pre->left;
Down(pre->right,now->right,to);
}
else
{
now->right=pre->right;
Down(pre->left,now->left,to);
}
Up(now);
} int Query(TreeNode *&pre,TreeNode *&now,int K)
{
if(now->l==now->r) return now->l;
int dis=now->left->dis-pre->left->dis;
if(dis<K) return Query(pre->right,now->right,K-dis);
else return Query(pre->left,now->left,K);
}
};
class PersistentLineSegmentTree tree; int main()
{
return ;
}

AC日记——K-th Number poj 2104的更多相关文章

  1. K-th Number POJ - 2104

    K-th Number POJ - 2104 You are working for Macrohard company in data structures department. After fa ...

  2. K-th Number Poj - 2104 主席树

    K-th Number Poj - 2104 主席树 题意 给你n数字,然后有m次询问,询问一段区间内的第k小的数. 解题思路 这个题是限时训练做的题,我不会,看到这个题我开始是拒绝的,虽然题意清晰简 ...

  3. 主席树 【权值线段树】 && 例题K-th Number POJ - 2104

    一.主席树与权值线段树区别 主席树是由许多权值线段树构成,单独的权值线段树只能解决寻找整个区间第k大/小值问题(什么叫整个区间,比如你对区间[1,8]建立一颗对应权值线段树,那么你不能询问区间[2,5 ...

  4. K-th Number POJ - 2104 划分树

    K-th Number You are working for Macrohard company in data structures department. After failing your ...

  5. AC日记——Destroying The Graph poj 2125

    Destroying The Graph Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8356   Accepted: 2 ...

  6. HDU 2665.Kth number-可持久化线段树(无修改区间第K小)模板 (POJ 2104.K-th Number 、洛谷 P3834 【模板】可持久化线段树 1(主席树)只是输入格式不一样,其他几乎都一样的)

    Kth number Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  7. AC日记——青蛙的约会 poj 1061

    青蛙的约会 POJ - 1061   思路: 扩展欧几里得: 设青蛙们要跳k步,我们可以得出式子 m*k+a≡n*k+b(mod l) 式子变形得到 m*k+a-n*k-b=t*l (m-n)*k-t ...

  8. hdu 2665 Kth number (poj 2104 K-th Number) 划分树

    划分树的基本功能是,对一个给定的数组,求区间[l,r]内的第k大(小)数. 划分树的基本思想是分治,每次查询复杂度为O(log(n)),n是数组规模. 具体原理见http://baike.baidu. ...

  9. poj 2104 K-th Number 主席树+超级详细解释

    poj 2104 K-th Number 主席树+超级详细解释 传送门:K-th Number 题目大意:给出一段数列,让你求[L,R]区间内第几大的数字! 在这里先介绍一下主席树! 如果想了解什么是 ...

随机推荐

  1. Neon Lights in Hong Kong【香港霓虹灯】

    Neon Lights in Hong Kong Neon is to Hong Kong as red phone booths are to London and fog is to San Fr ...

  2. The Suspects POJ 1611

    The Suspects Severe acute respiratory syndrome (SARS), an atypical pneumonia of unknown aetiology, w ...

  3. 海量数据处理算法—BitMap

    1. Bit Map算法简介 来自于<编程珠玑>.所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素.由于采用了Bit为单位来存储数据,因此在存储空 ...

  4. [原]sencha touch之NavigationView

    还是直接上代码,都是基本的几个容器控件,没什么还说的 Ext.application({ name:'itkingApp', launch:function(){ var view =Ext.crea ...

  5. cf984c Finite or not?

    一个十进制分数 \(p/q\) 在 \(b\) 进制下是有限小数的充要条件是 \(q\) 的所有质因子都是 \(b\) 的质因子. First, if \(p\) and \(q\) are not ...

  6. OpenStack之虚机热迁移

    OpenStack之虚机热迁移 最近要搞虚机的热迁移,所以也就看了看虚机迁移部分的内容.我的系统是CentOS6.5,此处为基于NFS共享平台的虚机迁移.有关NFS共享服务器的搭建可以看这里. Yak ...

  7. leetcode 【 Merge Sorted Array 】python 实现

    题目: Given two sorted integer arrays A and B, merge B into A as one sorted array. Note:You may assume ...

  8. STL学习笔记8 -- 函数对象

    重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象.一个类对象,表现出一个函数的特征,就是通过“对象名+(参数列表)”的方式使用一个类对象,如果 ...

  9. 聊聊、RabbitMQ 第一篇

    (一)windows 下安装配置 开源的消息中间件有很多,各有各的优缺点,适合自己项目的才是最好的.首先下载 rabbitMQ 安装版本,因为 rabbitMQ 底层语言是 erlang,所以首先要先 ...

  10. 初学Linux 命令

    查看ip:ifconfig 切换用户:us root(root为用户名) 显示当前目录:pwd 列出当前目录下所有文件:ls 进入某个目录 :cd 创建一个文件夹:mkdir 创建多个目录(当没有该父 ...