解题关键:离线求区间第k小,主席树的经典裸题;

对主席树的理解:主席树维护的是一段序列中某个数字出现的次数,所以需要预先离散化,最好使用vector的erase和unique函数,很方便;如果求整段序列的第k小,我们会想到离散化二分和线段树的做法, 而主席树只是保存了序列的前缀和,排序之后,对序列的前缀分别做线段树,具有差分的性质,因此可以求任意区间的第k小,如果主席树维护索引,只需要求出某个数字在主席树中的位置,即为sort之后v中的索引;若要求第k大,建树时反向排序即可

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<vector>
  5. #include<cstdlib>
  6. #include<iostream>
  7. #include<cmath>
  8. using namespace std;
  9. const int maxn=2e5+;
  10. int root[maxn];
  11. struct node{
  12. int l,r,sum;
  13. }p[maxn*];
  14. int cnt=;
  15. //建树从1开始建
  16. //rt是当前节点在p数组中的坐标
  17. int build(int l,int r){
  18. int rt=++cnt;
  19. p[rt].sum=;
  20. p[rt].l=p[rt].r=;
  21. if(l==r) return rt;
  22. int mid=(l+r)>>;
  23. p[rt].l=build(l,mid);
  24. p[rt].r=build(mid+,r);
  25. return rt;
  26. }//开始先建一棵空树,其实可以动态开点,就是各节点均为0
  27. int update(int l,int r,int c,int k){//update更新的是索引
  28. int nc=++cnt;
  29. p[nc]=p[c];
  30. p[nc].sum++;
  31. int mid=(l+r)>>;
  32. if(l==r) return nc;
  33. if(mid>=k) p[nc].l=update(l,mid,p[c].l,k);
  34. else p[nc].r=update(mid+,r,p[c].r,k);
  35. return nc;
  36. }
  37.  
  38. int query(int l,int r,int x,int y,int k){
  39. if(l==r) return l;
  40. int mid=(l+r)>>;
  41. int sum=p[p[y].l].sum-p[p[x].l].sum;
  42. if(sum>=k) return query(l,mid,p[x].l,p[y].l,k);
  43. else return query(mid+,r,p[x].r,p[y].r,k-sum);
  44. }
  45. vector<int>v;
  46. int a[maxn];
  47. int getid(int x){
  48. return int(lower_bound(v.begin(),v.end(),x)-v.begin())+;
  49. }
  50. int main(){
  51. ios::sync_with_stdio();
  52. cin.tie();
  53. cout.tie();
  54. int n,m;
  55. cin>>n>>m;
  56. for(int i=;i<=n;i++){
  57. cin>>a[i];
  58. v.push_back(a[i]);
  59. }
  60. sort(v.begin(),v.end());
  61. v.erase(unique(v.begin(), v.end()),v.end());
  62. //建树过程很重要
  63. //root[0]=build(1,v.size());//一定注意更新root数组
  64. //或者上面这句就不需要
  65. for(int i=;i<=n;i++){
  66. root[i]=update(,n,root[i-],getid(a[i]));//update是更新某个数出现次数的
  67. }
  68. int c,d,q;
  69. for(int i=;i<m;i++){
  70. cin>>c>>d>>q;
  71. int ans=query(,n,root[c-],root[d],q);
  72. cout<<v[ans-]<<endl;
  73. }
  74. return ;
  75. }

[poj2104]可持久化线段树入门题(主席树)的更多相关文章

  1. poj 2104 K-th Number (划分树入门 或者 主席树入门)

    题意:给n个数,m次询问,每次询问L到R中第k小的数是哪个 算法1:划分树 #include<cstdio> #include<cstring> #include<alg ...

  2. 【刷题】洛谷 P3834 【模板】可持久化线段树 1(主席树)

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

  3. POJ 2104 K-th Number && 洛谷 P3834 【模板】可持久化线段树 1(主席树)

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

  4. 洛谷P3834 [模板]可持久化线段树1(主席树) [主席树]

    题目传送门 可持久化线段树1(主席树) 题目背景 这是个非常经典的主席树入门题——静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定 ...

  5. 洛谷P3834【模板】可持久化线段树 1(主席树)

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

  6. LuoguP3834 【模板】可持久化线段树 1(主席树)|| 离散化

    题目:[模板]可持久化线段树 1(主席树) 不知道说啥. #include<cstdio> #include<cstring> #include<iostream> ...

  7. 【洛谷P3834】(模板)可持久化线段树 1(主席树)

    [模板]可持久化线段树 1(主席树) https://www.luogu.org/problemnew/show/P3834 主席树支持历史查询,空间复杂度为O(nlogn),需要动态开点 本题用一个 ...

  8. 【POJ2104】【HDU2665】K-th Number 主席树

    [POJ2104][HDU2665]K-th Number Description You are working for Macrohard company in data structures d ...

  9. dfs序+主席树 或者 树链剖分+主席树(没写) 或者 线段树套线段树 或者 线段树套splay 或者 线段树套树状数组 bzoj 4448

    4448: [Scoi2015]情报传递 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 588  Solved: 308[Submit][Status ...

  10. BZOJ_1901_Zju2112 Dynamic Rankings_树状数组+主席树

    BZOJ_1901_Zju2112 Dynamic Rankings_树状数组+主席树 题意: 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i, ...

随机推荐

  1. 查询某个字段为null并且某个字段不为null的数据

    查询代码为null且ggid不为null的公司名 select name_of_invested_company from dwtz WHERE code is NULL and ggid is no ...

  2. Swift 闭包的简单学习

    OC中已经学习了闭包 在swift里面 该怎么处理 不多说 上代码 //(num:Int) ->Bool是闭包的参数类型 func hasCloserMatch(arr :[Int], valu ...

  3. StartUML如何画“不折弯”的直线

    将下图中line style改成 OBlique.快捷键Ctrl +B

  4. 纯CSS3实现关闭按钮

    在线演示 本地下载

  5. Android蓝牙开发浅析【转】

    本文转载自:http://blog.csdn.net/geekdonie/article/details/7487761 由于近期正在开发一个通过蓝牙进行数据传递的模块,在参考了有关资料,并详细阅读了 ...

  6. Spring Cloud之服务治理(注册发现)

    服务治理SpringCloud Eureka 什么是服务治理 在传统rpc远程调用中,服务与服务依赖关系,管理比较复杂,所以需要使用服务治理,管理服务与服务之间依赖关系,可以实现服务调用.负载均衡.容 ...

  7. LINQ 学习路程 -- 查询操作 Conversion Operators

    Method Description AsEnumerable Returns the input sequence as IEnumerable<t> AsQueryable Conve ...

  8. SpringCloud-断路器(Hystrix)

    在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用Rest Template + Ribbon和Feign来调用.为了保证其高可用,单 ...

  9. ML2 Extension Manager

    The extension manager for ML2 was introduced in Juno (more details can be found in the approvedspec) ...

  10. Storm- 使用Storm实现词频汇总

    需求:读取指定目录的数据,并实现单词计数的功能 实现方案: Spout来读取指定目录的数据,作为后续Bolt处理的input 使用一个Bolt把input 的数据,切割分开,我们按照逗号进分割 使用一 ...