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. RDLC Reporting in Visual Studio 2017

    原文:RDLC Reporting in Visual Studio 2017 Visual Studio 2017 中可以使用 RDLC Reporting 插件来设计报表,SAP Crystal ...

  2. 4 Template层- HTML转义

    1.HTML转义 Django对字符串进行自动HTML转义,如在模板中输出如下值: 视图代码: def index(request): return render(request, 'temtest/ ...

  3. P3376 【模板】网络最大流dinic算法

    P3376 [模板]网络最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点 ...

  4. 《Scrum实战》第4次课【全职的Scrum Master】作业汇总

    1组: 孟帅 http://www.cnblogs.com/mengshuai1982/p/7375008.html 3组: 张亚辉 http://www.jianshu.com/p/df9eee08 ...

  5. 解决maven项目Invalid bound statement (not found)的方法

    用IDEA 做的ssm 的maven项目,登陆时出现上图问题. 原因是它读取不到DevUserMapper.xml文件和取它xml文件,后面查询在编译好的文件中,xml文件并没有引入进来,这就是导致出 ...

  6. 谋哥:App开发者的苦逼不值得怜悯!

    [谋哥每天一干货,第四十篇]        为什么取这个标题呢?因为昨天一些本来“支持”谋哥的人看到谋哥搞收费VIP群,觉得谋哥赚苦逼开发者的钱很不道德,且说谋哥我写的东西都不切实际,全部是一些思想性 ...

  7. 转:vc与界面开发之间的文章

    [很好的一篇文章,很喜欢看同行的心路历程:http://www.vckbase.com/index.php/nv/444.html] 本屌丝在新春放假期间闲来无事,在各大编程论坛溜达了一圈.发现年前的 ...

  8. 利用js阻止表单提交

    (1) return false <form name="loginForm" action="login.aspx" method="post ...

  9. python - web自动化测试 - 元素操作 - 等待

    # -*- coding:utf-8 -*- ''' @project: web学习 @author: Jimmy @file: wait.py @ide: PyCharm Community Edi ...

  10. 项目实战:CRM客户关系管理系统开发

    21-CRM第一节内容概要 21.1 Stark组件介绍:实现基本的增删改查+自定义复杂操作: 21.2 单例模式:最简单的单例模式: 21.3 路由系统(分发): 21.4 制作启动文件-Djang ...