题目链接:http://poj.org/problem?id=2104

主席树入门题目,主席树其实就是可持久化权值线段树,rt[i]维护了前i个数中第i大(小)的数出现次数的信息,通过查询两棵树的差即可得到第k大(小)元素。

  1. #include<cstdio>
  2. #include<vector>
  3. #include<algorithm>
  4. using namespace std;
  5.  
  6. #define lson(i) node[i].lson
  7. #define rson(i) node[i].rson
  8.  
  9. const int maxn=;
  10. int rt[maxn];
  11.  
  12. struct Node
  13. {
  14. int lson,rson,val;
  15. }node[maxn*];
  16. int tot;
  17.  
  18. void push_up(int i)
  19. {
  20. node[i].val=node[lson(i)].val+node[rson(i)].val;
  21. }
  22.  
  23. int build(int l,int r)
  24. {
  25. int i=++tot;
  26. if (l==r) node[i].val=;
  27. else
  28. {
  29. int mid=(l+r)/;
  30. lson(i)=build(l,mid);
  31. rson(i)=build(mid+,r);
  32. push_up(i);
  33. }
  34. return i;
  35. }
  36.  
  37. int rebuild(int k,int x,int i,int nowl,int nowr)
  38. {
  39. int th=++tot;
  40. lson(th)=lson(i);
  41. rson(th)=rson(i);
  42. node[th].val=node[i].val;
  43. if (nowl==nowr) node[th].val+=x;
  44. else
  45. {
  46. int mid=(nowl+nowr)/;
  47. if (k<=mid) node[th].lson=rebuild(k,x,lson(i),nowl,mid);
  48. else node[th].rson=rebuild(k,x,rson(i),mid+,nowr);
  49. push_up(th);
  50. }
  51. return th;
  52. }
  53.  
  54. int query(int rt1,int rt2,int k,int nowl,int nowr)
  55. {
  56. if (nowl==nowr) return nowl;
  57. int left=node[lson(rt2)].val-node[lson(rt1)].val;
  58. int mid=(nowl+nowr)/;
  59. if (left>=k) return query(lson(rt1),lson(rt2),k,nowl,mid);
  60. else return query(rson(rt1),rson(rt2),k-left,mid+,nowr);
  61. }
  62.  
  63. int a[maxn];
  64. vector<int> ls;
  65.  
  66. int main()
  67. {
  68. int n,m;
  69. scanf("%d%d",&n,&m);
  70. for (int i=;i<=n;i++) scanf("%d",&a[i]);
  71. ls.clear();
  72. for (int i=;i<=n;i++) ls.push_back(a[i]);
  73. sort(ls.begin(),ls.end());
  74. ls.erase(unique(ls.begin(),ls.end()),ls.end());
  75. rt[]=build(,n);
  76. for (int i=;i<=n;i++)
  77. {
  78. int j=lower_bound(ls.begin(),ls.end(),a[i])-ls.begin();
  79. rt[i]=rebuild(j+,,rt[i-],,n);
  80. }
  81. for (int i=;i<=m;i++)
  82. {
  83. int l,r,k;
  84. scanf("%d%d%d",&l,&r,&k);
  85. printf("%d\n",ls[query(rt[l-],rt[r],k,,n)-]);
  86. }
  87. return ;
  88. }

[poj 2104]主席树+静态区间第k大的更多相关文章

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

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

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

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

  3. HDU 2665 Kth number(主席树静态区间第K大)题解

    题意:问你区间第k大是谁 思路:主席树就是可持久化线段树,他是由多个历史版本的权值线段树(不是普通线段树)组成的. 具体可以看q学姐的B站视频 代码: #include<cmath> #i ...

  4. POJ2104-- K-th Number(主席树静态区间第k大)

    [转载]一篇还算可以的文章,关于可持久化线段树http://finaltheory.info/?p=249 无修改的区间第K大 我们先考虑简化的问题:我们要询问整个区间内的第K大.这样我们对值域建线段 ...

  5. HDU3727--Jewel (主席树 静态区间第k大)

    Jewel Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

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

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

  7. 主席树入门(区间第k大)

    主席树入门 时隔5个月,我又来填主席树的坑了,现在才发现学算法真的要懂了之后,再自己调试,慢慢写出来,如果不懂,就只会按照代码敲,是不会有任何提升的,都不如不照着敲. 所以搞算法一定要弄清原理,和代码 ...

  8. POJ 2104 K-th Number (区间第k大)

    题意:给定一个序列A,接下来又m个询问,每个询问输出A[L,R]中的第K大.(保证第k大存在) 思路: 我想拿来练习“可持久化线段树”的,搜到这个比较巧的算法也可以解决这个问题,叫“归并树?.大概的思 ...

  9. 洛谷.3834.[模板]可持久化线段树(主席树 静态区间第k小)

    题目链接 //离散化后范围1~cnt不要错 #include<cstdio> #include<cctype> #include<algorithm> //#def ...

随机推荐

  1. python——元组(tuple)基本操作

    元组被称为只读列表,数据可被查询,但不能被修改,类似于列表的切片操作,元组写在小括号里面()元素之前用逗号隔开 对于一些不想被修改的数据,可以用元组来保存 #  创建元组 1)创建空元组 # 创建空元 ...

  2. docker和docker compose常用操作命令

    首先区分一下docker中几个概念 Image:镜像,相当于一个root文件系统,不包含任何动态数据 Container:容器,镜像运行时的实体,实质是进程,容器进程运行于属于自己的独立的命名空间 d ...

  3. Android面试收集录 蓝牙与WiFi

    1.打开手机中的蓝牙功能有哪些方法? 法1:使用Intent  ==>new Intent(BluetoothAdaper.ACTION_REQUEST_ENABLE); startActivi ...

  4. 解析HTML利器AngleSharp介绍

    解析HTML利器AngleSharp介绍 AngleSharp是基于.NET(C#)开发的专门为解析xHTML源码的DLL组件. 项目地址:https://github.com/FlorianRapp ...

  5. CC3200模块的内存地址划分和bootloader(一)

    1. CC3200的内存地址划分非常特殊,如果没测试的话,很容易懵逼.我们先看芯片手册里面的内存地址.芯片的RAM是256KB,下图的0x2000 0000-0x2003 FFFF,正好是256KB. ...

  6. HMM相关文章索引

    HMM相关文章索引 1条回复 HMM系列文章是52nlp上访问量较高的一批文章,这里做个索引,方便大家参考. HMM学习 HMM学习最佳范例一:介绍 HMM学习最佳范例二:生成模式 HMM学习最佳范例 ...

  7. 云计算之路-阿里云上:受够了OCS,改用ECS+Couchbase跑缓存

    当今天早上在日志中发现这样的错误之后,对阿里云OCS(mecached缓存服务)的积怨倾泻而出. 2014-06-08 07:15:56,078 [ERROR] Enyim.Caching.Memca ...

  8. Mysql性能优化三:主从配置,读写分离

    大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库连接操作,数据库必然会崩溃,数据丢 ...

  9. 安装arch系统时,把ubuntu的efi分区格式化

    导致无法从grub进入ubuntu,之后我进入win10,把ubuntu的分区都删了. 再重启,只能进入黑色的grub界面,显示 grub>> 甚至无法进入win10.只能通过在开机时按F ...

  10. LeetCode 410——分割数组的最大值

    1. 题目 2. 解答 此题目为 今日头条 2018 AI Camp 5 月 26 日在线笔试编程题第二道--最小分割分数. class Solution { public: // 若分割数组的最大值 ...