解题关键:划分树模板题。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<cstdlib>
  5. #include<iostream>
  6. #include<cmath>
  7. using namespace std;
  8. typedef long long ll;
  9. const int MAXN=;
  10. int tree[][MAXN],sorted[MAXN],toleft[][MAXN];
  11. void build(int l,int r,int dep){
  12. if(l==r)return;
  13. int mid=(l+r)>>;
  14. int same=mid-l+;//表示等于中间值而且被分入左边的个数
  15. for(int i=l;i<=r;i++)
  16. if(tree[dep][i]<sorted[mid])
  17. same--;
  18. int lpos=l,rpos=mid+;
  19. for(int i=l;i<=r;i++){
  20. if(tree[dep][i]<sorted[mid])//比中间的数小,分入左边
  21. tree[dep+][lpos++]=tree[dep][i];
  22. else if(tree[dep][i]==sorted[mid]&&same>){
  23. tree[dep+][lpos++]=tree[dep][i];
  24. same--;
  25. }
  26. else tree[dep+][rpos++]=tree[dep][i];
  27. toleft[dep][i]=toleft[dep][l-]+lpos-l;//从1到i放左边的个数
  28. }
  29. build(l,mid,dep+);
  30. build(mid+,r,dep+);
  31. }
  32.  
  33. //查询区间第k大的数,[L,R]是大区间,[l,r]是要查询的小区间
  34. int query(int L,int R,int dep,int l,int r,int k){
  35. if(l==r)return tree[dep][l];
  36. int mid=(L+R)>>;
  37. int cnt=toleft[dep][r]-toleft[dep][l-];//[l,r]中位于左边的个数
  38. if(cnt>=k){
  39. //L+要查询的区间前被放在左边的个数
  40. int newl=L+toleft[dep][l-]-toleft[dep][L-];
  41. //左端点加上查询区间会被放在左边的个数
  42. int newr=newl+cnt-;
  43. return query(L,mid,dep+,newl,newr,k);
  44. }
  45. else{
  46. int newr=r+toleft[dep][R]-toleft[dep][r];//懂了
  47. int newl=newr-(r-l-cnt);
  48. return query(mid+,R,dep+,newl,newr,k-cnt);
  49. }
  50. }
  51.  
  52. int main(){
  53. int T;
  54. int n,m;
  55. int s,t,k;
  56. scanf("%d",&T);
  57. while(T--){
  58. scanf("%d%d",&n,&m);
  59. memset(tree,,sizeof tree);//这个必须
  60. for(int i=;i<=n;i++){
  61. scanf("%d",&tree[][i]);
  62. sorted[i]=tree[][i];
  63. }
  64. sort(sorted+,sorted+n+);
  65. build(,n,);
  66. while(m--){
  67. scanf("%d%d%d",&s,&t,&k);
  68. printf("%d\n",query(,n,,s,t,k));
  69. }
  70. }
  71. return ;
  72. }

[hdu2665]Kth number(划分树求区间第k大)的更多相关文章

  1. HDU 3473 Minimum Sum (划分树求区间第k大带求和)(转)

    题意:在区间中找一个数,求出该区间每个数与这个数距离的总和,使其最小 找的数字是中位数(若是偶数个,则中间随便哪个都可)接着找到该区间比此数大的数的总和 区间中位数可以使用划分树,然后在其中记录:每层 ...

  2. K-th Number 线段树的区间第K大

    http://poj.org/problem?id=2104 由于这题的时间限制不紧,所以用线段树水一水. 每个节点保存的是一个数组. 就是对应区间排好序的数组. 建树的时间复杂度需要nlogn 然后 ...

  3. [csu/coj 1080]划分树求区间前k大数和

    题意:从某个区间内最多选择k个数,使得和最大 思路:首先题目给定的数有负数,如果区间前k大出现负数,那么负数不选和更大,于是对于所有最优选择,负数不会出现,所以用0取代负数,问题便转化为区间的前k大数 ...

  4. HDOJ题目4417 Super Mario(划分树求区间比k小的个数+二分)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  5. [poj2104]kth-number(归并树求区间第k大)

    复杂度:$O(nlog^3n)$ #include<cstdio> #include<cstring> #include<algorithm> #include&l ...

  6. poj 2104 主席树(区间第k大)

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 44940   Accepted: 14946 Ca ...

  7. POJ2761---Feed the dogs (Treap求区间第k大)

    题意 就是求区间第k大,区间 不互相包含. 尝试用treap解决一下 第k大的问题. #include <set> #include <map> #include <cm ...

  8. hdu 2665 Kth number(划分树模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=2665 [ poj 2104 2761 ]  改变一下输入就可以过 http://poj.org/problem? ...

  9. POJ2104 k-th number 划分树

    又是不带修改的区间第k大,这次用的是一个不同的方法,划分树,划分树感觉上是模拟了快速排序的过程,依照pivot不断地往下划分,然后每一层多存一个toleft[i]数组,就可以知道在这一层里从0到i里有 ...

随机推荐

  1. Android.mk用法详解

    一.Android.mk介绍 Android.mk是Android提供的一种makefile文件,用来指定诸如编译生成so库名.引用的头文件目录.需要编译的.c/.cpp文件和.a静态库文件等.要掌握 ...

  2. session 与 cookie 区别

    一.Session的概念 Session 是存放在服务器端的,类似于Session结构来存放用户数据,当浏览器 第一次发送请求时,服务器自动生成了一个Session和一个Session ID用来唯一标 ...

  3. RK3288 增加双屏异显 eDP+LVDS

    CPU:RK3288 系统:Android 5.1 下面是官方文档中的信息. 1.rk3288 支持的显示接口可以任意组合. 2.双屏异显时,一个显示接口当主屏,另一个当副屏:主副屏由板级 dts 文 ...

  4. 语义分割【semantic-segmentation】资料备忘

    https://github.com/mrgloom/awesome-semantic-segmentation

  5. SQLServer中求两个字符串的交集(字符串以符号分隔)

    两个字符串,以特定符号分隔(例如‘,’号),求交集 第一种情况: declare @m varchar(100),@n varchar(100)select @m=',2,3,5,7,8,9,10,' ...

  6. dubbox实现REST服务

    一.dubbox的由来 dubbox是当当网基于dubbo的基础上开发的扩展版,也可以认为是dubbo的升级版,根据当前互联网的应用需求,增加了很多扩展的功能. dubbox并没有发布到maven中央 ...

  7. eclipse 创建一个java项目 运行

    五.使用Eclipse 1)第一次打开需要设置工作环境,你可以指定工作目录,或者使用默认的C盘工作目录,点击 ok 按钮. 2)创建一个项目 3)输入项目名称,比如我输入Orz_Jlx,然后点击fin ...

  8. python的可变数据类型和不可变类型

    python里面一切皆对象 ython的每个对象都分为可变类型和不可变类型 整形,浮点型,字符串,元组属于不可变类型,列表,字典是可变类型 不可变数据类型 对不可变类型的变量重新赋值,实际上是重新创建 ...

  9. 浅谈PHP面向对象编程(一、简介)

    传统的面向过程 将要完成的工作,分作若干个步骤,或再细分为子步骤,然后后步骤从前往后一步一步完成,最初达致目标. 现代的面向对象 将要完成的工作拆分为“一个一个对象”的任务(功能),每个对象独自完成自 ...

  10. MySql——触发器

    触发器 什么叫触发器: 就是mysql中的一种“一触即发”的机器(机制). 其实只是预先定义好的一段代码.该段代码无需人工调用,而是会在‘预计’好的某个情形下自动执行. 通常就这几个情形: 对某个数据 ...