[划分树] POJ 2104 K-th Number
Time Limit: 20000MS | Memory Limit: 65536K | |
Total Submissions: 51732 | Accepted: 17722 | |
Case Time Limit: 2000MS |
Description
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 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
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
Source
#include<stdio.h>
#include<algorithm>
using namespace std;
int tree[20][110001],sorted[110001],left[20][110001];
void build(int dep,int l,int r)
{
int mid=(l+r)>>1,i,midnum=mid-l+1,sonl=l,sonr=mid+1;
for(i=l;i<=r;++i) if(sorted[i]<sorted[mid]) --midnum; //寻找能放入左子树中值的个数
for(i=l;i<=r;++i)
{
if(i==l) left[dep][i]=0; else left[dep][i]=left[dep][i-1]; //对不同的区间,进行左
//树个数初始化
if(tree[dep][i]==sorted[mid])
{
if(midnum)
{
--midnum;
++left[dep][i];
tree[dep+1][sonl++]=tree[dep][i]; //统计进入左子树的个数,并更新//下一层树
} else tree[dep+1][sonr++]=tree[dep][i];
} else
if(tree[dep][i]<sorted[mid]) //比中间值小,入左子树
{
++left[dep][i];
tree[dep+1][sonl++]=tree[dep][i];
} else tree[dep+1][sonr++]=tree[dep][i]; //比中间值小,入右子树
}
if(l==r) return; //如果是叶子结点,返回
build(dep+1,l,mid); //递归左右子树
build(dep+1,mid+1,r);
}
int query(int dep,int l,int r,int ql,int qr,int k)
{
int l_ql,ql_qr,mid=(l+r)>>1;
if(l==r) return tree[dep][l]; //如果找到值,返回
if(l==ql) //恰好是所求左区间为递归左区间
{ //
l_ql=0;
ql_qr=left[dep][qr];
} else
{
l_ql=left[dep][ql-1]; //l到ql-1的入左区间数
ql_qr=left[dep][qr]-l_ql; //ql到qr的左区间数
}
if(k<=ql_qr) return query(dep+1,l,mid,l+l_ql,l+l_ql+ql_qr-1,k); else //递归下一区间
return query(dep+1,mid+1,r,mid+1+ql-l_ql-l,mid+1+qr-ql_qr-l_ql-l,k-ql_qr);
//右区间有点乱,ql-l-l_ql即l到ql-1中入右区间的个数依次类推
}
int main()
{
int n,m,i,ql,qr,qk;
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i)
{
scanf("%d",&tree[0][i]);
sorted[i]=tree[0][i];
}
sort(sorted+1,sorted+n+1);
build(0,1,n);
while(m--)
{
scanf("%d%d%d",&ql,&qr,&qk);
printf("%d\n",query(0,1,n,ql,qr,qk));
}
return 0;
}
[划分树] POJ 2104 K-th Number的更多相关文章
- HDU 4417 (划分树+区间小于k统计)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4417 题目大意:给定一个区间,以及一个k值,求该区间内小于等于k值的数的个数.注意区间是从0开始的 ...
- 划分树 静态第k大
划分树是保存了快速排序的过程的树,可以用来求静态第k小的数 如果,划分树可以看做是线段树,它的左孩子保存了mid-L+1 个 小于等于 a[mid] 的数字, 右孩子保存了 R-mid个大于等于a[ ...
- POJ 2104:K-th Number(主席树静态区间k大)
题目大意:对于一个序列,每次询问区间[l,r]的第k大树. 分析: 主席树模板题 program kthtree; type point=record l,r,s:longint; end; var ...
- 【POJ 2104】 K-th Number 主席树模板题
达神主席树讲解传送门:http://blog.csdn.net/dad3zz/article/details/50638026 2016-02-23:真的是模板题诶,主席树模板水过.今天新校网不好,没 ...
- POJ 2104:K-th Number(整体二分)
http://poj.org/problem?id=2104 题意:给出n个数和m个询问求区间第K小. 思路:以前用主席树做过,这次学整体二分来做.整体二分在yr大佬的指点下,终于大概懂了点了.对于二 ...
- POJ 2104:K-th Number 整体二分
感觉整体二分是个很有趣的东西. 在别人的博客上看到一句话 对于二分能够解决的询问,如果有多个,那么如果支持离线处理的话,那么就可以使用整体二分了 树套树写了一天还是WA着,调得焦头烂额,所以决定学cd ...
- 主席树----POJ 2104(主席树裸题)(转)
首先来介绍一下我们需求:给你n个数,多次问你某个区间内的第k小是哪个数 主席树: 主席树的全名应该是 函数式版本的线段树.加上附带的一堆 technology.. ..总之由于原名字太长了,而且 “主 ...
- POJ 2104 K-th Number(区间第k大数)(平方切割,归并树,划分树)
题目链接: http://poj.org/problem? id=2104 解题思路: 由于查询的个数m非常大.朴素的求法无法在规定时间内求解. 因此应该选用合理的方式维护数据来做到高效地查询. 假设 ...
- K-th Number POJ - 2104 划分树
K-th Number You are working for Macrohard company in data structures department. After failing your ...
随机推荐
- Windows2012 显示我的电脑
从Windows2012开始,微软取消了服务器桌面个性化选项,如何重新调出配置界面,可以使用微软命令调出.具体方法如下: 1.同时按住键盘上的“Windows键”+“R”,调出运行窗口.在运行窗口输入 ...
- JITComVCTK无法访问
源代码第一次加载时会遇到JITComVCTK无法访问的问题,这是因为没有注册该第三方插件,需要到文件夹"\CommonFiles\dll\JITComVCTK"下注册,具体方式: ...
- shell,bash,git bash,xshell,ssh
一:shell是linux/unix系统的外壳,也可以理解为命令行接口,就是你输入并执行命令行的地方.bash(born again shell)是shell的一种,最常用的shell之一.你在你的l ...
- item布局里有button之类的子控件时,会截获焦点
需要以上问题时,网上查了很多,结果都是使用android:descendantFocusability属性,设为blocksDescendants就ok了,(具体不详叙述) 可是我给item的根布局设 ...
- PHP入门【一】$_SERVER
这几天要个同事写php的程序,就开始学习了PHP ,基础语法不用说了语言都是基本相通的,只是有若类型和强类型的区别(声明数据类型) 把现在看到的感觉有用的记录一下. $_SERVER['PHP_SEL ...
- latex给表格添加注释
给表格加注释的确是很多TeX用户不好用的地方,这里提供一个样式和代码,或许对于你的学习使用有所帮助,样式如下: 代码如下: \documentclass[11pt,a4paper,english]{a ...
- Docker常见问题解决
一.Docker中运行ubuntu容器,字体颜色太深导致无法看清 解决方案: 1. 利用dircolors命令,查看我们的系统当前的文件名称显示颜色的值,然后利用管道重定向到用户目录下的任意一个文件( ...
- CentOS6.5安装Nginx
1.安装prce(重定向支持)和openssl(https支持,如果不需要https可以不安装.) yum -y install pcre* yum -y install openssl* 2.下载n ...
- rxjava源码分析
RXjava响应式编程 此文作者大暴雨原创,转载请注明出处. 如果线程的知识不是很丰富,请先查看 rxjava源码中的线程知识 一文 rxjava总结就是:异步实现主要是通过扩展观察者模式 ...
- 转:eclipse打开文件或者目录位置(不使用插件)
http://my.oschina.net/havoc/blog/204958?p= 首先说不使用插件的方法 WINDOWS eclipse配置 Run-->External Tools--&g ...