poj-2104(区间第K大问题)

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstdio>
  4. #include <cstring>
  5. using namespace std;
  6. struct T {
  7. int ls;
  8. int rs;
  9. int sum;
  10. };
  11. const int N=1e5+;
  12. T tri[*N];
  13. int a[N],sort_a[N];
  14. int rt[N];
  15. int cnt;
  16. int n,m;
  17. void update (int l,int r,int rt1,int &rt2,int pos) {
  18. rt2=++cnt;
  19. tri[rt2]=tri[rt1];
  20. tri[rt2].sum++;// 在此处直接更新,就不用pushup了
  21. if (l==r) return ;
  22. int mid=(l+r)/;
  23. if (pos<=mid) update (l,mid,tri[rt1].ls,tri[rt2].ls,pos);
  24. else update (mid+,r,tri[rt1].rs,tri[rt2].rs,pos);
  25. return ;
  26. }
  27. int query (int l,int r,int rt1,int rt2,int k) {
  28. if (l==r) return sort_a[l];
  29. int mid=(l+r)/;
  30. int sum=tri[tri[rt2].ls].sum-tri[tri[rt1].ls].sum;//我又出错了 sum应该是左子树的节点数 T_T !
  31. if (k<=sum) return query (l,mid,tri[rt1].ls,tri[rt2].ls,k);
  32. else return query (mid+,r,tri[rt1].rs,tri[rt2].rs,k-sum);
  33. }
  34. int main ()
  35. {
  36. scanf ("%d %d",&n,&m);
  37. for (int i=;i<=n;i++) {
  38. scanf ("%d",&a[i]);
  39. sort_a[i]=a[i];
  40. }
  41. sort (sort_a+,sort_a++n);
  42. int num=;
  43. for (int i=;i<=n;i++) {
  44. if (sort_a[i]!=sort_a[i-])
  45. sort_a[++num]=sort_a[i];//离散化
  46. }
  47. rt[]=cnt=;
  48. tri[].sum=tri[].ls=tri[].rs=;
  49. for (int i=;i<=n;i++) {
  50. int pos=lower_bound (sort_a+,sort_a++num,a[i])-sort_a;
  51. update (,num,rt[i-],rt[i],pos);
  52. }
  53. for (int i=;i<=m;i++) {
  54. int x,y,k;
  55. scanf ("%d %d %d",&x,&y,&k);
  56. printf("%d\n",query (,num,rt[x-],rt[y],k));
  57. }
  58. return ;
  59. }

NO.2   HDOJ-4417(主席数的区间求和)

  1. #include<cstdio>
  2. #include<algorithm>
  3. const int N=1e5+;
  4. using namespace std;
  5. struct node {
  6. int ls;
  7. int rs;
  8. int sum;
  9. };
  10. node tri[*N];
  11. int rt[N];
  12. int a[N],sort_a[N+];
  13. int cnt,n,m,x,y,k;
  14. void updata (int l,int r,int rt1,int& rt2,int pos) {
  15. rt2=(++cnt);
  16. tri[rt2]=tri[rt1];
  17. tri[rt2].sum++;
  18. if (l==r) return ;
  19. int mid=(l+r)/;
  20. if (pos<=mid) updata(l,mid,tri[rt1].ls,tri[rt2].ls,pos);
  21. else updata(mid+,r,tri[rt1].rs,tri[rt2].rs,pos);
  22. return ;
  23. }
  24. int query (int l,int r,int L,int R,int rt1,int rt2) {
  25. if (r<L||l>R) return ;
  26. if (l>=L&&r<=R) return tri[rt2].sum-tri[rt1].sum;
  27. int mid=(l+r)/;
  28. int t1=query(l,mid,L,R,tri[rt1].ls,tri[rt2].ls);
  29. int t2=query(mid+,r,L,R,tri[rt1].rs,tri[rt2].rs);
  30. return t1+t2;
  31. }
  32. int main ()
  33. {
  34. int T;
  35. int tt=;
  36. scanf ("%d",&T);
  37. while (T--) {
  38. printf("Case %d:\n",tt++);
  39. scanf ("%d %d",&n,&m);
  40. for (int i=;i<=n;i++) {
  41. scanf ("%d",&a[i]);
  42. sort_a[i]=a[i];
  43. }
  44. sort(sort_a+,sort_a++n);
  45. int num=;
  46. for (int i=;i<=n;i++) {
  47. if (sort_a[i]!=sort_a[num])
  48. sort_a[++num]=sort_a[i];
  49. }
  50. cnt=;
  51. rt[]=;
  52. tri[].ls=tri[].rs=tri[].sum=;
  53. for (int i=;i<=n;i++) {
  54. int pos=lower_bound(sort_a+,sort_a++num,a[i])-sort_a;
  55. updata(,num,rt[i-],rt[i],pos);
  56. }
  57. for (int i=;i<=m;i++) {
  58. scanf ("%d %d %d",&x,&y,&k);
  59. int t=lower_bound(sort_a+,sort_a++num,k)-sort_a;
  60. if (t>num||sort_a[t]>k) t--;// 这个好 找最后一个小于等于k的数
  61. int ans=query (,num,,t,rt[x],rt[y+]);// 因为题目从0开始计数
  62. printf("%d\n",ans);
  63. }
  64. }
  65. return ;
  66. }

No.3 xdoj-1216(子树第k小)——dfs+主席树

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<vector>
  4. using namespace std;
  5. const int N=1e5+;
  6. struct T{
  7. int ls;
  8. int rs;
  9. int sum;
  10. };
  11. vector < vector <int> > g(N);
  12. T tri[N*];
  13. int rt[N],b[N],sort_b[N];
  14. int in[N],out[N];
  15. int val[N];
  16. int cnt,num;
  17. int n,q;
  18. int x,k;
  19. void dfs (int id,int pre) {
  20. num++;
  21. sort_b[num]=b[num]=val[id];
  22. in[id]=num;
  23. for (int i=;i<g[id].size();i++) {
  24. int next=g[id][i];
  25. if (next==pre) continue;
  26. dfs (next,id);
  27. }
  28. out[id]=num;
  29. }
  30. void updata (int l,int r,int pos,int rt1,int& rt2) {
  31. cnt++;
  32. rt2=cnt;
  33. tri[cnt]=tri[rt1];
  34. tri[cnt].sum++;
  35. if (l==r) return ;
  36. int mid=(l+r)/;
  37. if (pos<=mid) updata (l,mid,pos,tri[rt1].ls,tri[rt2].ls);
  38. else updata (mid+,r,pos,tri[rt1].rs,tri[rt2].rs);
  39. return ;
  40. }
  41. int query (int l,int r,int k,int rt1,int rt2) {
  42. if (l==r) return l;
  43. int mid=(l+r)/;
  44. int ans;
  45. int sum=tri[tri[rt2].ls].sum-tri[tri[rt1].ls].sum;
  46. if (k<=sum) ans=query (l,mid,k,tri[rt1].ls,tri[rt2].ls);
  47. else ans=query (mid+,r,k-sum,tri[rt1].rs,tri[rt2].rs);
  48. return ans;
  49. }
  50. int main ()
  51. {
  52. while (scanf ("%d",&n)!=EOF) {
  53. for (int i=;i<=n;i++) g[i].clear();
  54. for (int i=;i<=n;i++)
  55. scanf ("%d",&val[i]);
  56. int u,v;
  57. for (int i=;i<=n-;i++) {
  58. scanf ("%d %d",&u,&v);
  59. g[u].push_back(v);
  60. g[v].push_back(u);
  61. }
  62. num=;
  63. dfs (,-);// 按理说有根树 直接dfs(1)就可以了可是这样答案是不对的 是我理解错了还是数据有问题呢
  64. sort(sort_b+,sort_b++n);
  65. int nn=;
  66. for (int i=;i<=n;i++)
  67. if (sort_b[i]!=sort_b[nn])
  68. sort_b[++nn]=sort_b[i];
  69. rt[]=;
  70. tri[].rs=tri[].ls=tri[].sum=;
  71. cnt=;
  72. for (int i=;i<=n;i++) {
  73. int pos=lower_bound(sort_b+,sort_b++nn,b[i])-sort_b;
  74. updata(,nn,pos,rt[i-],rt[i]);
  75. }
  76. scanf ("%d",&q);
  77. for (int i=;i<=q;i++) {
  78. scanf ("%d %d",&x,&k);
  79. int ans=query (,nn,k,rt[in[x]-],rt[out[x]]);
  80. printf ("%d\n",sort_b[ans]);
  81. }
  82. }
  83. return ;
  84. }

线段树专题2-(加强版线段树-可持续化线段树)主席树 orz! ------用于解决区间第k大的问题----xdoj-1216的更多相关文章

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

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

  2. 可持久化线段树(主席树)(图文并茂详解)【poj2104】【区间第k大】

    [pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=63740442 向大(hei)佬(e)实力学(di ...

  3. Permutation UVA - 11525(值域树状数组,树状数组区间第k大(离线),log方,log)(值域线段树第k大)

    Permutation UVA - 11525 看康托展开 题目给出的式子(n=s[1]*(k-1)!+s[2]*(k-2)!+...+s[k]*0!)非常像逆康托展开(将n个数的所有排列按字典序排序 ...

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

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

  5. 【BZOJ3551】Peaks加强版(Kruskal重构树,主席树)

    [BZOJ3551]Peaks加强版(Kruskal重构树,主席树) 题面 BZOJ Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相 ...

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

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

  7. 【ZOJ2112】【整体二分+树状数组】带修改区间第k大

    The Company Dynamic Rankings has developed a new kind of computer that is no longer satisfied with t ...

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

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

  9. hdu 5919--Sequence II(主席树--求区间不同数个数+区间第k大)

    题目链接 Problem Description Mr. Frog has an integer sequence of length n, which can be denoted as a1,a2 ...

随机推荐

  1. weblogic开启http访问日志并实时写入日志文件

    由于http访问会产生大量日志,耗去不少IO和CPU所以在生产一般是不启用的:但有时我们会想启用http访问日志,尤其是在系统上线调试的时候. weblogic的日志默认在domain_name/se ...

  2. shiro jwt 构建无状态分布式鉴权体系

    一:JWT 1.令牌构造 JWT(json web token)是可在网络上传输的用于声明某种主张的令牌(token),以JSON 对象为载体的轻量级开放标准(RFC 7519). 一个JWT令牌的定 ...

  3. oracle函数NVL,NVL2和NULLIF之间的区别和使用

    oracle用这么几个函数,可以帮助我们解决数据上null或0的处理 1.NVL()函数 1.1)介绍:NVL(expr1,expr2),若expr1为null, 返回expr2; 不为null,返回 ...

  4. HTTP上传数据 :表单,二进制数据(multipart/form-data application/octet-stream boundary)

    使用WinINet 一个较简单的例子:上传头像 void CBackstageManager::UpdateAvatarThreadProc(LPVOID params) { stForThread* ...

  5. hdu 2065 "红色病毒"问题(快速幂求模)

    n=1  --> ans = 2 = 1*2 = 2^0(2^0+1) n=2  -->  ans = 6 = 2*3 = 2^1(2^1+1) n=3  -->  ans = 20 ...

  6. 记录一次面试中的HTTP请求相关问题

    1.HTTP中的状态码分别代表什么 比较基础,自行百度.   2.HTTP请求,响应头部content-length用来做什么的 答:Content-Length首部告诉浏览器报文中实体主体的大小.这 ...

  7. 学习Linux系统的方法有很多,适合自己的才是最好

    综观现在互联网+的发展以及应用,作为一个从事IT行业的人员,应该懂得Linux占比多大份量,所以说,去掌握Linux是一种相当重要的谋生途径,当然,如果你对它产生情感那更好.这篇文章主要是本人结合自身 ...

  8. hdu1693

    题解: 还是插头dp 代码: #include<cstdio> #include<cstring> #include<algorithm> #include< ...

  9. Saiku部分函数解析(八)

    Saiku函数解析 1.   now()  :  获取当前日期 直接使用即可 2. IIF(logic_exp, string, string): IIF判断,logic_exp是逻辑表达式,结果为t ...

  10. nginx负载均衡实验

    Nginx负载均衡概述 Web服务器,直接面向用户,往往要承载大量并发请求,单台服务器难以负荷,我使用多台WEB服务器组成集群,前端使用Nginx负载均衡,将请求分散的打到我们的后端服务器集群中,实现 ...