例题:poj2104 http://poj.org/problem?id=2104

讲解,推荐博客:http://blog.sina.com.cn/s/blog_6022c4720102w03t.html

http://seter.is-programmer.com/posts/31907.html

http://www.cnblogs.com/shenben/p/5598371.html

数组版:

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. const int N=;
  5. int l_child[N*],r_child[N*],sum[N*];
  6. int n,m,a[N],hash[N],cnt,root[N];
  7. int x,y,k;
  8. void discrete()
  9. {
  10. sort(hash+,hash+n+);
  11. cnt=unique(hash+,hash+n+)-(hash+);
  12. for(int i=;i<=n;i++) a[i]=lower_bound(hash+,hash+cnt+,a[i])-hash;
  13. }
  14. int init()
  15. {
  16. int x=,f=;char c=getchar();
  17. while(c<''||c>'') {if(c=='-') f=-;c=getchar();}
  18. while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
  19. return x*f;
  20. }
  21. int query(int x,int y,int l,int r,int k)
  22. {
  23. if(l==r) return l;
  24. int mid=l+r>>,tmp=sum[l_child[y]]-sum[l_child[x]];
  25. if(tmp>=k) return query(l_child[x],l_child[y],l,mid,k);
  26. else return query(r_child[x],r_child[y],mid+,r,k-tmp);
  27. }
  28. int tot=;
  29. void build(int x,int &y,int l,int r,int v)
  30. {
  31. sum[y=++tot]=sum[x]+;
  32. if(l==r) return;
  33. int mid=l+r>>;
  34. if(v<=mid)
  35. {
  36. r_child[y]=r_child[x];
  37. build(l_child[x],l_child[y],l,mid,v);
  38. }
  39. else
  40. {
  41. l_child[y]=l_child[x];
  42. build(r_child[x],r_child[y],mid+,r,v);
  43. }
  44. }
  45. int main()
  46. {
  47. n=init();m=init();
  48. for(int i=;i<=n;i++) a[i]=init(),hash[i]=a[i];
  49. discrete();
  50. //for(int i=1;i<=n;i++) printf("%d ",a[i]);
  51. for(int i=;i<=n;i++) build(root[i-],root[i],,cnt,a[i]);
  52. for(int i=;i<=m;i++)
  53. {
  54. x=init();y=init();k=init();
  55. printf("%d\n",hash[query(root[x-],root[y],,cnt,k)]);
  56. }
  57. }

指针版:TLE

  1. #include<cstdio>
  2. #include<algorithm>
  3. #define N 100001
  4. using namespace std;
  5. int n,m,a[N],hash[N];
  6. int tot,cnt;
  7. struct node
  8. {
  9. node * l,* r;
  10. int sum;
  11. };
  12. node * root[N];
  13. void discrete()
  14. {
  15. sort(a+,a+n+);
  16. tot=unique(a+,a+n+)-(a+);
  17. for(int i=;i<=n;i++) hash[i]=lower_bound(a+,a+n+,hash[i])-a;
  18. }
  19. inline node * build(node * pre,int l,int r,int w)
  20. {
  21. node *neww=new node();
  22. //node * neww=(node *)malloc(sizeof(node));
  23. neww->sum=pre->sum+;
  24. if(l==r) return neww;
  25. int mid=l+r>>;
  26. if(w<=mid)
  27. {
  28. neww->r=pre->r;
  29. neww->l=build(pre->l,l,mid,w);
  30. }
  31. else
  32. {
  33. neww->l=pre->l;
  34. neww->r=build(pre->r,mid+,r,w);
  35. }
  36. return neww;
  37. }
  38. inline int query(node * x,node * y,int k,int l,int r)
  39. {
  40. if(l==r) return l;
  41. int mid=l+r>>,tmp=y->l->sum-x->l->sum;
  42. if(k<=tmp) return query(x->l,y->l,k,l,mid);
  43. else return query(x->r,y->r,k-tmp,mid+,r);
  44. }
  45. node * null(int ll,int rr)
  46. {
  47. node *neww=new node();
  48. //node * neww=(node *)malloc(sizeof(node));
  49. neww->l=neww->r=NULL;
  50. neww->sum=;
  51. if(ll==rr) return neww;
  52. int mid=ll+rr>>;
  53. neww->l=null(ll,mid);
  54. neww->r=null(mid+,rr);
  55. return neww;
  56. }
  57. int main()
  58. {
  59. scanf("%d%d",&n,&m);
  60. for(int i=;i<=n;i++) {scanf("%d",&a[i]);hash[i]=a[i];}
  61. discrete();
  62. root[]=null(,n);
  63. for(int i=;i<=n;i++) root[i]=build(root[i-],,n,hash[i]);
  64. int x,y,k;
  65. for(int i=;i<=m;i++)
  66. {
  67. scanf("%d%d%d",&x,&y,&k);
  68. printf("%d\n",a[query(root[x-],root[y],k,,n)]);
  69. }
  70. }

主席树——求静态区间第k大的更多相关文章

  1. 主席树(静态区间第k大)

    前言 如果要求一些数中的第k大值,怎么做? 可以先就这些数离散化,用线段树记录每个数字出现了多少次. ... 那么考虑用类似的方法来求静态区间第k大. 原理 假设现在要有一些数 我们可以对于每个数都建 ...

  2. 可持久化线段树(主席树)——静态区间第k大

    主席树基本操作:静态区间第k大 #include<bits/stdc++.h> using namespace std; typedef long long LL; ,MAXN=2e5+, ...

  3. 主席树 - 查询某区间第 K 大

    You are working for Macrohard company in data structures department. After failing your previous tas ...

  4. 主席树入门——询问区间第k大pos2104,询问区间<=k的元素个数hdu4417

    poj2104找了个板子..,但是各种IO还可以进行优化 /* 找区间[l,r]第k大的数 */ #include<iostream> #include<cstring> #i ...

  5. POJ 2104 【主席树】【区间第K大】

    #include<stdio.h> #include<algorithm> #include<string.h> #define MAXN 100010 #defi ...

  6. 静态区间第k大(归并树)

    POJ 2104为例 思想: 利用归并排序的思想: 建树过程和归并排序类似,每个数列都是子树序列的合并与排序. 查询过程,如果所查询区间完全包含在当前区间中,则直接返回当前区间内小于所求数的元素个数, ...

  7. poj2104&&poj2761 (主席树&&划分树)主席树静态区间第k大模板

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

  8. HDU3473--Minimum Sum(静态区间第k大)

    Minimum Sum Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  9. 主席树学习笔记(静态区间第k大)

    题目背景 这是个非常经典的主席树入门题——静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 输入输出 ...

随机推荐

  1. -Android -线程池 批量上传图片 -附php接收代码

    (出处:http://www.cnblogs.com/linguanh/) 目录: 1,前序 2,类特点 3,用法 4,java代码 5,php代码 1,前序 还是源于重构,看着之前为赶时间写着的碎片 ...

  2. 你真的会玩SQL吗?查询指定节点及其所有父节点的方法

    --查询ID = '009'的所有父节点 ' ;WITH T AS ( SELECT ID , PID , NAME FROM TB WHERE ID = @ID UNION ALL SELECT A ...

  3. ASP.NET Core 中文文档 第四章 MVC(2.3)格式化响应数据

    原文:Formatting Response Data 作者:Steve Smith 翻译:刘怡(AlexLEWIS) 校对:许登洋(Seay) ASP.NET Core MVC 内建支持对相应数据( ...

  4. Centos 上 Tengine安装

    安装步骤: 1.系统环境 1.1 更新系统 [root@centos ~]# yum update -y 1.2 查看环境 [root@centos ~]# cat /etc/redhat-relea ...

  5. 谈谈枚举的新用法——java

    问题的由来 前段时间改游戏buff功能,干了一件愚蠢的事情,那就是把枚举和运算集合在一起,然后运行一段时间后buff就出现各种问题,我当时懵逼了! 事情是这样的,做过游戏的都知道,buff,需要分类型 ...

  6. JQuery Sizzle引擎源代码分析

    最近在拜读艾伦在慕课网上写的JQuery课程,感觉在国内对JQuery代码分析透彻的人没几个能比得过艾伦.有没有吹牛?是不是我说大话了? 什么是Sizzle引擎? 我们经常使用JQuery的选择器查询 ...

  7. MongoDB初识

    参考: MongoDB资料汇总专题:

  8. Lambda 表达式递归用法实例

    注意: 使用Lambda表达式会增加额外开销,但却有时候又蛮方便的. Windows下查找子孙窗口实例: HWND FindDescendantWindows(HWND hWndParent, LPC ...

  9. Python 基础之四初识Python数据类型

    数字 Int,整型 Float,浮点型 Long,长整型 布尔 字符串 列表 元组 字典 1.数字 INT(整型) 在32位系统上,整数的位数为32位,取值范围为-2**31~2**31-1,即-21 ...

  10. nodejs微信公众号快速开发|自定义关键字回复

    一点说明: nodejs 微信api 扩展,集成大部分功能. 案例 https://github.com/leiroc/node-wxeasy-example 上传example中文件到服务器 ,然后 ...