[划分树] 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 ...
随机推荐
- Other linker flags
-ObjC:加了这个参数后,链接器就会把静态库中所有的Objective-C类和分类都加载到最后的可执行文件中-all_load:会让链接器把所有找到的目标文件都加载到可执行文件中,但是千万不要随便使 ...
- C4.5算法的学习笔记
有日子没写博客了,这些天忙着一些杂七杂八的事情,直到某天,老师喊我好好把数据挖掘的算法搞一搞!于是便由再次埋头看起算法来!说起数据挖掘的算法,我想首先不得的不提起的就是大名鼎鼎的由决策树算法演化而来的 ...
- 【Java】模板方法模式
今天介绍的是模板方法模式~ 模板方法模式,由父类定制总体的框架,具体的细节由子类实现. 一般来说,模板方法中有3类方法: 抽象方法,父类声明方法待子类具体实现.比如例子的validate.save.u ...
- mysql replace
replace(object, search,replace) 示例:update table set col1 = replace(col1, 'a', 'A'); 将col1字段中的小写a替换成大 ...
- 浪潮 NF5240M3 ,NP5540M3 服务器安装2008 R2
1,服务器系统的安装会出现错误的地方一般都是在Raid 卡驱动 略过Raid 卡配置, 具体 http://jingyan.baidu.com/article/ca41422fddfd201eae99 ...
- Python notes
1. range()函数的使用: a = range(n) # a = range(0,n) b = range(m,n) # b = range(m,n) alist = list(a) # ali ...
- 慕课网__CSS_网页图标制作
参考地址:http://www.flowerboys.cn/font/article/fontsArticle/how-to-turn-your-icons-into-a-web-font.html
- hdu 5587 Array
题目链接:hdu 5587 前两周 bc 上的题了,因为赶大作业所以没有去打,看了下官方给出的思路,感觉好强大~~竟然能转化成求二进制数 1 的个数: 然后数位 dp 就行了, #include< ...
- Linux新建用户并添加到sudo组
原文参考链接:https://www.douban.com/note/338488349/ 以在kali 下添加一个test用户为例: Step1#:添加新用户useradd -r -m -s /bi ...
- 用流来读取文件(getline,istringstream)
ifstream infile("fileanme"); 原型:getline(istream &infile, string &line); 函数说明:读取文件中 ...