静态区间第k大的问题,往往可以利用主席树来解决

这是主席树的第一道题

主席树大概可以理解为在n个节点上都建立一棵线段树,但是想想会超出内存

每一个节点保存的线段树都记录当前整段前缀区间的信息

但是因为每次添加后一个节点,那么他除了当前节点位置需要更新之外,其他的位置都可以保持跟上一棵节点对应的线段树一致,那么为了缩小内存,

将那些不需要改变的点的指针指向上一棵树对应的节点即可,其他多生成的节点也就是需要更新的节点,最多不超过log2n个,所以最后产生的线段树的

点的个数大概在nlogn的大致范围内

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <iostream>
  5. using namespace std;
  6. #define N 100005
  7. #define M int m=(l+r)>>1
  8. #define LS(o) node[o].ls
  9. #define RS(o) node[o].rs
  10.  
  11. int n , m , a[N] , b[N] , T[N];
  12.  
  13. struct Node{
  14. int sz , ls , rs;
  15. void init(){sz=;ls=rs=;}
  16. }node[N*];
  17.  
  18. int tot;
  19.  
  20. int build(int l , int r)
  21. {
  22. int u = tot++;
  23. node[u].init();
  24. if(l!=r){
  25. M;
  26. node[u].ls = build(l , m);
  27. node[u].rs = build(m+ , r);
  28. }
  29. return u;
  30. }
  31.  
  32. void build(int o1 , int o2 , int l , int r , int pos)
  33. {
  34. node[o2].init();
  35. node[o2].sz = node[o1].sz+;
  36. M;
  37. if(l == r) return;
  38. if(pos<=m){
  39. node[o2].ls = tot++ , node[o2].rs = RS(o1);
  40. build(LS(o1) , LS(o2) , l , m , pos);
  41. }
  42. else {
  43. node[o2].rs = tot++ , node[o2].ls = LS(o1);
  44. build(RS(o1) , RS(o2) , m+ , r , pos);
  45. }
  46. }
  47.  
  48. int query(int o1 , int o2 , int l , int r , int k)
  49. {
  50. if(l==r) return l;
  51. M;
  52. int tmp;
  53. if((tmp=node[LS(o2)].sz - node[LS(o1)].sz)>=k) return query(LS(o1) , LS(o2) , l , m , k);
  54. else return query(RS(o1) , RS(o2) , m+ , r , k-tmp);
  55. }
  56.  
  57. int main()
  58. {
  59. // freopen("in.txt" , "r" , stdin);
  60. while(~scanf("%d%d" , &n , &m)){
  61. for(int i= ; i<=n ; i++)scanf("%d" , a+i);
  62. for(int i= ; i<=n ; i++)b[i]=a[i];
  63. sort(b+ , b+n+);
  64. tot = ;
  65. T[] = build( , n);
  66. for(int i= ; i<=n ; i++){
  67. int pos = lower_bound(b+ , b+n+ , a[i])-b;
  68. T[i] = tot++;
  69. build(T[i-] , T[i] , , n , pos);
  70. }
  71. while(m--){
  72. int s , t , k;
  73. scanf("%d%d%d" , &s , &t , &k);
  74. int pos = query(T[s-] , T[t] , , n , k);
  75. printf("%d\n" , b[pos]);
  76. }
  77. }
  78. return ;
  79. }

POJ 2104 静态找区间第k大的更多相关文章

  1. POJ 2104 求序列里第K大 主席树裸题

    给定一个n的序列,有m个询问 每次询问求l-r 里面第k大的数字是什么 只有询问,没有修改 可以用归并树和划分树(我都没学过..囧) 我是专门冲着弄主席树来的 对主席树的建树方式有点了解了,不过这题为 ...

  2. POJ 2104 K-th Number(区间第k大数)(平方切割,归并树,划分树)

    题目链接: http://poj.org/problem? id=2104 解题思路: 由于查询的个数m非常大.朴素的求法无法在规定时间内求解. 因此应该选用合理的方式维护数据来做到高效地查询. 假设 ...

  3. POJ 2104(K-th Number-区间第k大-主席树)

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 31790   Accepted: 9838 Cas ...

  4. POJ 2104 && POJ 2761 (静态区间第k大,主席树)

    查询区间第K大,而且没有修改. 使用划分树是可以做的. 作为主席树的入门题,感觉太神奇了,Orz /* *********************************************** ...

  5. 【POJ】【2104】区间第K大

    可持久化线段树 可持久化线段树是一种神奇的数据结构,它跟我们原来常用的线段树不同,它每次更新是不更改原来数据的,而是新开节点,维护它的历史版本,实现“可持久化”.(当然视情况也会有需要修改的时候) 可 ...

  6. POJ 2104 K-th Number 主席树(区间第k大)

    题目链接: http://poj.org/problem?id=2104 K-th Number Time Limit: 20000MSMemory Limit: 65536K 问题描述 You ar ...

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

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

  8. POJ 2104 HDU 2665 主席树 解决区间第K大

    两道题都是区间第K大询问,数据规模基本相同. 解决这种问题, 可以采用平方划分(块状表)复杂度也可以接受,但是实际表现比主席树差得多. 这里大致讲一下我对主席树的理解. 首先,如果对于某个区间[L,R ...

  9. 数据结构2 静态区间第K大/第K小

    给定数组$A[1...N]$, 区间$[L,R]$中第$K$大/小的数的指将$A[L...R]$中的数从大到小/从小到大排序后的第$K$个. "静态"指的是不带修改. 这个问题有多 ...

随机推荐

  1. golang代码执行顺序

    一:首先man.go,整个程序的入口 func main() { beego.Run() } 然后beego.run()代码 // Run beego application. // beego.Ru ...

  2. nexus 2.6需要jdk7才能跑起来

    Java 6 Support EOLOracle's support for Java 6 ended in February 2013.  Consequentially as of version ...

  3. git命令之git rebase 的用法

    rebase 假设你现在基于远程分支"origin",创建一个叫"mywork"的分支. $ git checkout -b mywork origin 现在我 ...

  4. C++常量(C++数值常量、字符串常量、符号常量)

    http://see.xidian.edu.cn/cpp/biancheng/view/104.html 字符串常量 用双撇号括起来的部分就是字符串常量,如"abc"," ...

  5. JavaScript的事件对象_鼠标事件

    鼠标事件是 Web 上面最常用的一类事件,毕竟鼠标还是最主要的定位设备.那么通过事件对象可以获取到鼠标按钮信息和屏幕坐标获取等. 一.鼠标按钮 只有在主鼠标按钮被单击时(常规一般是鼠标左键)才会触发 ...

  6. 接收ET采集器数据页面

    <%@ page language="java" import="java.util.*,java.sql.*" pageEncoding="u ...

  7. phalcon: Windows 下 Phalcon dev-tools 配置 和 Phpstorm中配置Phalcon 代码提示, phalcon tools的使用

    准备: phalcon-devtools包 下载地址: https://github.com/phalcon/phalcon-devtools 解压到wampserver的www目录 (xampp 用 ...

  8. 抛弃vboot不格盘用grub4dos+firadisk安装Ghost版XP到VHD,轻松RAMOS!

    http://bbs.wuyou.net/forum.php?mod=viewthread&tid=363198&extra=抛弃vboot不格盘用grub4dos+firadisk安 ...

  9. jQuery clone()方法绑定事件

    先看如下代码: (function ($) { var div = $("<div></div>").css({width: "100px&quo ...

  10. JavaWeb基础: 学习大纲

    JavaWeb基础: Web应用和Web服务器 JavaWeb基础: Tomcat JavaWeb基础:HTTP协议和基于Restful的架构 JavaWeb基础: Web工程配置文件 JavaWeb ...