给定一个n的序列,有m个询问 每次询问求l-r 里面第k大的数字是什么

只有询问,没有修改

可以用归并树和划分树(我都没学过。。囧)

我是专门冲着弄主席树来的

对主席树的建树方式有点了解了,不过这题为什么是在主席树里面这么操作的 还是有点不懂,今天照着模板敲了一遍就打多校了

再研究吧

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. const int maxn=110010;
  7. const int maxm=maxn*30;
  8. int n,m,tot,s;
  9. int A[maxn],t[maxn],T[maxn];
  10. int c[maxm],lson[maxm],rson[maxm];
  11. int build(int l,int r)
  12. {
  13. int rt=++tot;
  14. c[rt]=0;
  15. if (l>=r) return rt;
  16. int mid=(l+r)>>1;
  17. lson[rt]=build(l,mid);
  18. rson[rt]=build(mid+1,r);
  19. return rt;
  20. }
  21. int update(int rt,int pos,int val)
  22. {
  23. int newrt=++tot,tmp=newrt;
  24. c[newrt]=c[rt]+val;
  25. int l=1,r=s;
  26. while (l<r)
  27. {
  28. int mid=(l+r)>>1;
  29. if (pos<=mid){
  30. r=mid;
  31. lson[newrt]=++tot;rson[newrt]=rson[rt];
  32. newrt=lson[newrt];rt=lson[rt];
  33. }
  34. else{
  35. l=mid+1;
  36. rson[newrt]=++tot;lson[newrt]=lson[rt];
  37. newrt=rson[newrt];rt=rson[rt];
  38. }
  39. c[newrt]=c[rt]+val;
  40. }
  41. return tmp;
  42. }
  43. int query(int lrt,int rrt,int k)
  44. {
  45. int l=1,r=s;
  46. while (l<r)
  47. {
  48. int mid=(l+r)>>1;
  49. if (c[lson[lrt]]-c[lson[rrt]]>=k){
  50. r=mid;
  51. lrt=lson[lrt];
  52. rrt=lson[rrt];
  53. }
  54. else
  55. {
  56. l=mid+1;
  57. k-=c[lson[lrt]]-c[lson[rrt]];
  58. lrt=rson[lrt];
  59. rrt=rson[rrt];
  60. }
  61. }
  62. return l;
  63. }
  64. int main()
  65. {
  66. while (scanf("%d%d",&n,&m)!=EOF)
  67. {
  68. //memset(c,0,sizeof c);
  69. tot=0;
  70. for (int i=1;i<=n;i++) scanf("%d",&A[i]),t[i]=A[i];
  71. sort(t+1,t+1+n);
  72. //t[0]=0;
  73. s=unique(t+1,t+1+n)-t-1;
  74. //cout<<s<<endl;
  75. T[n+1]=build(1,s);
  76. for (int i=n;i>=1;i--){
  77. int pos=lower_bound(t+1,t+s+1,A[i])-t;
  78. T[i]=update(T[i+1],pos,1);
  79. }
  80. while (m--)
  81. {
  82. int l,r,k;
  83. scanf("%d%d%d",&l,&r,&k);
  84. int ans=query(T[l],T[r+1],k);
  85. printf("%d\n",t[ans]);
  86. }
  87. }
  88. return 0;
  89. }

  

POJ 2104 求序列里第K大 主席树裸题的更多相关文章

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

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

  2. 【POJ】2104 K-th Number(区间k大+主席树)

    http://poj.org/problem?id=2104 裸题不说.主席树水过. #include <cstdio> #include <iostream> #includ ...

  3. POJ-2104-K-th Number(区间第K大+主席树模板题)

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

  4. 计蒜客 38229.Distance on the tree-1.树链剖分(边权)+可持久化线段树(区间小于等于k的数的个数)+离散化+离线处理 or 2.树上第k大(主席树)+二分+离散化+在线查询 (The Preliminary Contest for ICPC China Nanchang National Invitational 南昌邀请赛网络赛)

    Distance on the tree DSM(Data Structure Master) once learned about tree when he was preparing for NO ...

  5. [POJ 2104]K-th Number【模板】(主席树)

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

  6. POJ 2104 静态找区间第k大

    静态区间第k大的问题,往往可以利用主席树来解决 这是主席树的第一道题 主席树大概可以理解为在n个节点上都建立一棵线段树,但是想想会超出内存 每一个节点保存的线段树都记录当前整段前缀区间的信息 但是因为 ...

  7. Count on a tree(SPOJ COT + 树上第k大 + 主席树 + LCA)

    题目链接:https://www.spoj.com/problems/COT/en/ 题目: 题意: 给你一棵有n个节点的树,求节点u到节点v这条链上的第k大. 思路: 我们首先用dfs进行建题目给的 ...

  8. 主席树----POJ 2104(主席树裸题)(转)

    首先来介绍一下我们需求:给你n个数,多次问你某个区间内的第k小是哪个数 主席树: 主席树的全名应该是 函数式版本的线段树.加上附带的一堆 technology.. ..总之由于原名字太长了,而且 “主 ...

  9. HDU2665 求区间第K大 主席树

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2665 代码: //#include<bits/stdc++.h> #include< ...

随机推荐

  1. JS链接转换为二维码

    这里用到一个JQ插件 qrcode.js   下载地址https://github.com/jeromeetienne/jquery-qrcode 先引入 <script src="j ...

  2. 1-m*n循环填数(用标记数组)blibli2018秋招第三题一个类型

    #include <iostream> #include<string> #include<algorithm> using namespace std; ; in ...

  3. myeclipse中svn图标状态不显示问题的解决办法

    myeclipse中svn图标状态不显示问题的解决办法 博客分类: svn SVNMyeclipse工作WindowsC  myeclipse中使用 svn 插件,原本正常,未作任何更改,突然有一天, ...

  4. 什么叫github

    git remote add origin https://github.com/huiwangui/git-demo.git:表示在本地仓库关联远程仓库(https://github.com/hui ...

  5. query.locate过个过滤参数

    需要引用Variants locate( 'typeid;name',vararrayof([key1,key2]),[]);

  6. redis.rpm 安装

    yum install jemalloc wget http://www6.atomicorp.com/channels/atomic/centos/6/x86_64/RPMS/redis-3.0.7 ...

  7. Linux打印变量、环境配置、别名和文件删除操作

    一.打印命令 1.echo打印命令 a.打印环境变量 echo $Path b.打印Path命令目录 which,比如:which ls表示打印的是Path目录中第一定义的全局变量的目录中命令. 二. ...

  8. 吴裕雄--天生自然JAVA数据库编程:执行数据库更新操作

    import java.sql.Connection ; import java.sql.DriverManager ; import java.sql.Statement ; public clas ...

  9. P1061 判断题

    P1061 判断题 转跳点:

  10. 回收 PV【转】

    当 PV 不再需要时,可通过删除 PVC 回收. 当 PVC mypvc1 被删除后,我们发现 Kubernetes 启动了一个新 Pod recycler-for-mypv1,这个 Pod 的作用就 ...