博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 2665 Kth number(划分树)
阅读量:6416 次
发布时间:2019-06-23

本文共 2903 字,大约阅读时间需要 9 分钟。

Kth number

Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 37 Accepted Submission(s): 25
 
Problem Description
Give you a sequence and ask you the kth big number of a inteval.
 
Input
The first line is the number of the test cases. 
For each test case, the first line contain two integer n and m (n, m <= 100000), indicates the number of integers in the sequence and the number of the quaere. 
The second line contains n integers, describe the sequence. 
Each of following m lines contains three integers s, t, k. 
[s, t] indicates the interval and k indicates the kth big number in interval [s, t]
 
Output
For each test case, output m lines. Each line contains the kth big number.
 
Sample Input
1 10 1 1 4 2 3 5 6 7 8 9 0 1 3 2
 
Sample Output
2
 
 
Source
HDU男生专场公开赛——赶在女生之前先过节(From WHU)
 
Recommend
zty
 
/*----------------------------------------------File: Date: 2017/6/9 21:40:22Author: LyuCheng----------------------------------------------*/#include 
#define MAXN 100005using namespace std;int t,n;int q,l,r,k;/************************************划分树模板************************************/int a[MAXN]; //原数组int sorted[MAXN]; //排序好的数组//是一棵树,但把同一层的放在一个数组里。int num[20][MAXN]; //num[i] 表示i前面有多少个点进入左孩子int val[20][MAXN]; //20层,每一层元素排放,0层就是原数组void build(int l,int r,int ceng){ if(l==r) return ; int mid=(l+r)/2,isame=mid-l+1; //isame保存有多少和sorted[mid]一样大的数进入左孩子 for(int i=l;i<=r;i++) if(val[ceng][i]
0) { val[ceng+1][ln++]=val[ceng][i]; num[ceng][i]++; if(val[ceng][i]==sorted[mid]) isame--; } else { val[ceng+1][rn++]=val[ceng][i]; } } build(l,mid,ceng+1); build(mid+1,r,ceng+1);}int look(int ceng,int sl,int sr,int l,int r,int k){ if(sl==sr) return val[ceng][sl]; int ly; //ly 表示l 前面有多少元素进入左孩子 if(l==sl) ly=0; //和左端点重合时 else ly=num[ceng][l-1]; int tolef=num[ceng][r]-ly; //这一层l到r之间进入左子树的有tolef个 if(tolef>=k) { return look(ceng+1,sl,(sl+sr)/2,sl+ly,sl+num[ceng][r]-1,k); } else { // l-sl 表示l前面有多少数,再减ly 表示这些数中去右子树的有多少个 int lr = (sl+sr)/2 + 1 + (l-sl-ly); //l-r 去右边的开头位置 // r-l+1 表示l到r有多少数,减去去左边的,剩下是去右边的,去右边1个,下标就是lr,所以减1 return look(ceng+1,(sl+sr)/2+1,sr,lr,lr+r-l+1-tolef-1,k-tolef); }}/************************************划分树模板************************************/int main(int argc, char *argv[]){ // freopen("in.txt","r",stdin); scanf("%d",&t); while(t--){ scanf("%d%d",&n,&q); for(int i=1;i<=n;i++){ scanf("%d",&val[0][i]); sorted[i]=val[0][i]; } sort(sorted+1,sorted+n+1); build(1,n,0); while(q--){ scanf("%d%d%d",&l,&r,&k); printf("%d\n",look(0,1,n,l,r,k)); } } return 0;}

 

转载于:https://www.cnblogs.com/wuwangchuxin0924/p/6974008.html

你可能感兴趣的文章
Spring Boot 3 Hibernate
查看>>
查询EBS请求日志的位置和名称
查看>>
大型机、小型机、x86服务器的区别
查看>>
JVM调优总结:调优方法
查看>>
J2EE十三个规范小结
查看>>
算法(第四版)C#题解——2.1
查看>>
网关支付、银联代扣通道、快捷支付、银行卡支付分别是怎么样进行支付的?...
查看>>
大数据开发实战:Stream SQL实时开发一
查看>>
C++返回引用的函数例程
查看>>
C语言可变参数,参数传递
查看>>
你若安好便是晴天_百度百科
查看>>
Linux iptables 开放Mysql端口允许远程访问
查看>>
Mathematica 汉化教程
查看>>
JQuery EasyUI 读取设置input
查看>>
详解Java解析XML的四种方法(转载)
查看>>
32位系统win2008+mssql2008 6G内存折腾纪实
查看>>
3dmax快捷键
查看>>
js与php中一些相似函数的对比
查看>>
谈谈D2
查看>>
模式匹配之sift--- sift图像特征提取与匹配算法代码
查看>>