K-th Number Poj - 2104 主席树

题意

给你n数字,然后有m次询问,询问一段区间内的第k小的数。

解题思路

这个题是限时训练做的题,我不会,看到这个题我开始是拒绝的,虽然题意清晰简单,但是真的不会。限时结束后,学长说这个题是简单的主席树的入门题,我没学过啊。

如果你也没有学过的话,建议看我的另一篇博客,上面有自己的总结和一些博客推荐,就不用自己一个一个找了,点我进去

哦, 这个题是主席树的模板题。

代码实现

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<vector>
  4. #include<algorithm>
  5. using namespace std;
  6. const int maxn=1e5+7;
  7. int root[maxn], a[maxn], x, y, k;
  8. int n, m, cnt, tot;
  9. struct node{
  10. int l, r, sum; //左子树的编号,右子树的编号,区间内的标记的数的个数
  11. }t[maxn*40];
  12. vector<int> v;
  13. int getid(int x) //需要进行离散化,因为主席树叶子端点上就是一个数。
  14. {
  15. return lower_bound(v.begin(), v.end(), x) - v.begin() + 1; //这里用vector进行的离散化,比较简单
  16. }
  17. void update(int l, int r, int &x, int y, int pos) //注意参数中的l和r是区间范围,和node里面的l和r不一样,node里面的l和r表示左右子树的编号
  18. //这里相当于建树+更新了,有的博客还单独写了一个build函数,然后再进行update,都行。
  19. {
  20. t[++cnt]=t[y];
  21. t[cnt].sum++;
  22. x=cnt;//这里是把新节点的编号记录下来
  23. if(l==r) return ;
  24. int mid=(l+r)>>1;
  25. if(pos<=mid)//如果需要添加的编号小于mid,就向左子树走
  26. update(l, mid, t[x].l, t[y].l, pos);
  27. else //否则就是往右子树走
  28. update(mid+1, r, t[x].r, t[y].r, pos);
  29. }
  30. int query(int l, int r, int x, int y, int k) //这里的l和r也是区间范围,x是前一个线段树
  31. {
  32. if(l==r)
  33. return l;
  34. int mid=(l+r)>>1;
  35. int sum=t[t[y].l].sum - t[t[x].l].sum;
  36. if(k<=sum)
  37. return query(l, mid, t[x].l, t[y].l, k);
  38. else
  39. return query(mid+1, r, t[x].r, t[y].r, k-sum);
  40. }
  41. int main()
  42. {
  43. scanf("%d%d", &n, &m);
  44. for(int i=1; i<=n; i++)
  45. {
  46. scanf("%d", &a[i]);
  47. v.push_back(a[i]);
  48. }
  49. sort(v.begin(), v.end()); //先排序,才能去重+离散化
  50. v.erase( unique( v.begin(), v.end() ) , v.end() );//去重
  51. tot=v.size(); //注意这里很重要,1到tot是我们主席树端点的个数。
  52. for(int i=1; i<=n; i++)
  53. {
  54. update(1, tot, root[i], root[i-1], getid(a[i]) );
  55. }
  56. for(int i=1; i<=m; i++)
  57. {
  58. scanf("%d%d%d", &x, &y, &k);
  59. printf("%d\n", v[ query(1, tot, root[x-1], root[y], k) - 1]);
  60. }
  61. return 0;
  62. }

K-th Number Poj - 2104 主席树的更多相关文章

  1. [poj 2104]主席树+静态区间第k大

    题目链接:http://poj.org/problem?id=2104 主席树入门题目,主席树其实就是可持久化权值线段树,rt[i]维护了前i个数中第i大(小)的数出现次数的信息,通过查询两棵树的差即 ...

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

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

  3. K-th Number POJ - 2104 划分树

    K-th Number You are working for Macrohard company in data structures department. After failing your ...

  4. POJ 2104 - 主席树 / 询问莫队+权值分块

    传送门 题目大意应该都清楚. 今天看到一篇博客用分块+莫对做了这道题,直接惊呆了. 首先常规地离散化后将询问分块,对于某一询问,将莫队指针移动到指定区间,移动的同时处理权值分块的数字出现次数(单独.整 ...

  5. POJ 2104 主席树模板题

    #include <iostream> #include <cstdio> #include <algorithm> int const maxn = 200010 ...

  6. 主席树 【权值线段树】 && 例题K-th Number POJ - 2104

    一.主席树与权值线段树区别 主席树是由许多权值线段树构成,单独的权值线段树只能解决寻找整个区间第k大/小值问题(什么叫整个区间,比如你对区间[1,8]建立一颗对应权值线段树,那么你不能询问区间[2,5 ...

  7. K-th Number POJ - 2104

    K-th Number POJ - 2104 You are working for Macrohard company in data structures department. After fa ...

  8. BZOJ_4026_dC Loves Number Theory _主席树+欧拉函数

    BZOJ_4026_dC Loves Number Theory _主席树+欧拉函数 Description  dC 在秒了BZOJ 上所有的数论题后,感觉萌萌哒,想出了这么一道水题,来拯救日益枯 竭 ...

  9. HDU 2665.Kth number-可持久化线段树(无修改区间第K小)模板 (POJ 2104.K-th Number 、洛谷 P3834 【模板】可持久化线段树 1(主席树)只是输入格式不一样,其他几乎都一样的)

    Kth number Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

随机推荐

  1. Centos7.5源码安装nginx-1.16.0

    安装nginx的依赖包(pcre-devel openssl-devel) yum install -y gcc gcc-c++ make pcre pcre-devel zlib zlib-deve ...

  2. linux服务器安全配置攻略

    引言: 最小的权限+最少的服务=最大的安全 所以,无论是配置任何服务器,我们都必须把不用的服务关闭.把系统权限设置到最小话,这样才能保证服务器最大的安全.下面是CentOS服务器安全设置,供大家参考. ...

  3. springboot easyexcel

    pom..xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel&l ...

  4. mac下安装 rabbitMq

    1.安装HomeBrew,如果已经安装这一步跳过. 2.用brew install rabbitmq指令即可进行rabbitmq服务的自动安装. 3.安装完成之后会出现一下提示:   rabbit安装 ...

  5. easyuUI实现客户分页显示逻辑分析

    页面 前端 前端easyUI,自带分页功能,添加pagination属性 前端会传给后端两个属性: page:当前页码 rows:每页显示记录数 后端 接收page和rows参数 根据参数分页查询 获 ...

  6. 【LuoguP5171】Earthquake

    题目链接 题意 求满足如下不等式的非负整数 \(x,y\) 的对数 \[ax+by\leq c\] Sol a,b,c 都是非负的,那么先随便变个形: \[y\leq\frac{c-ax}{b}\] ...

  7. 一天久坐办公室,怎么减fei?!

    久坐的危害想必看到这篇文章的,一定都百度浏览了好多文章了,所以危害大家也都知道了,这里也就不一一列出. 久坐有危害,那么怎么减少危害呢,办法是什么???那就是不久坐啦.可是因为工作性质,不久坐臣妾恐怕 ...

  8. Java——常用类(基础类型数据包装类)

    [包装类]   包装类(如Integer.Double等)这些类封装了一个相应的基础数据类型数值,并为其提供了一系列操作.     例如:java.lang.Integer类提供了以下构造方法:   ...

  9. HDU 6614 AND Minimum Spanning

    Time limit 1000 ms Memory limit 131072 kB OS Windows 中文题意 给一张n个点的无向完全图(输入一个n就完事了),每个点标号为1~n,每条边的边权为它 ...

  10. APIO2019解题报告

    「APIO 2019」奇怪装置 题目描述 有无限个二元组,每个二元组为\(((t+\left\lfloor\frac{t}{B} \right\rfloor)\%A,t \% B)\),给出一些区间, ...