题目链接:https://cn.vjudge.net/contest/284294#problem/B

题目大意:查询区间内有多少个不相同的数。

具体思路:主席树的做法,主席树的基础做法是查询区间第k大或者第k小的,但是这个地方查询的是区间内不同的数的个数,我们就按照下标建立主席树,对于区间[l,r],我们存储的是区间[l,r]中有多少个不同的数,对于当前的数,如果没有出现过,我们就在第i个位置给他加上,如果已经出现过,我们在建立下一棵主席树的时候,先将之前的这个数的下标对应的值减去1.探后再在第i个位置加上这个1,这样的话,可以实现题目中的操作了。

AC代码:

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<algorithm>
  4. #include<vector>
  5. using namespace std;
  6. # define ll long long
  7. const int maxn = 1e5+;
  8. struct node
  9. {
  10. int sum;
  11. int l,r;
  12. } tree[maxn*];
  13. int sto[maxn],root[maxn];
  14. vector<int>q;
  15. int tot;
  16. void init()
  17. {
  18. tot=;
  19. root[]=;
  20. }
  21. int get_id(int t)
  22. {
  23. return lower_bound(q.begin(),q.end(),t)-q.begin()+;
  24. }
  25. int add(int pre)
  26. {
  27. int t=++tot;
  28. tree[t].sum=tree[pre].sum+;
  29. tree[t].l=tree[pre].l;
  30. tree[t].r=tree[pre].r;
  31. return t;
  32. }
  33. void update(int &o,int pre,int l,int r,int pos)
  34. {
  35. o=add(pre);
  36. if(l==r)return ;
  37. int m=(l+r)>>;
  38. if(pos<=m)update(tree[o].l,tree[o].l,l,m,pos);
  39. else update(tree[o].r,tree[o].r,m+,r,pos);
  40. }
  41. int query(int st,int ed,int l,int r,int k){
  42. if(l==r)return r;
  43. int sum=tree[tree[ed].l].sum-tree[tree[st].l].sum;
  44. int m=(l+r)>>;
  45. if(k<=sum)return query(tree[st].l,tree[ed].l,l,m,k);
  46. else return query(tree[st].r,tree[ed].r,m+,r,k-sum);
  47. }
  48. int main()
  49. {
  50. int n,m;
  51. while(~scanf("%d %d",&n,&m))
  52. {
  53. init();
  54. for(int i=; i<=n; i++)
  55. {
  56. scanf("%d",&sto[i]);
  57. q.push_back(sto[i]);
  58. }
  59. sort(q.begin(),q.end());
  60. q.erase(unique(q.begin(),q.end()),q.end());
  61. int num=q.size();
  62. for(int i=; i<=n; i++)
  63. {
  64. update(root[i],root[i-],,num,get_id(sto[i]));
  65. }
  66. int t1,t2,k;
  67. while(m--){
  68. scanf("%d %d %d",&t1,&t2,&k);
  69. printf("%d\n",q[query(root[t1-],root[t2],,num,k)-]);
  70. }
  71. }
  72. return ;
  73. }

B - 低阶入门膜法 - D-query (查询区间内有多少不同的数)的更多相关文章

  1. A - 低阶入门膜法 - K-th Number (主席树查询区间第k小)

    题目链接:https://cn.vjudge.net/contest/284294#problem/A 题目大意:主席树查询区间第k小. 具体思路:主席树入门. AC代码: #include<i ...

  2. LOJ #6279. 数列分块入门 3-分块(区间加法、查询区间内小于某个值x的前驱(比其小的最大元素))

    #6279. 数列分块入门 3 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 3   题目描述 给 ...

  3. LOJ #6278. 数列分块入门 2-分块(区间加法、查询区间内小于某个值x的元素个数)

    #6278. 数列分块入门 2 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 6   题目描述 给出 ...

  4. TensorFlow低阶API(四)—— 图和会话

    简介 TensorFlow使用数据流图将计算表示为独立的指令之间的依赖关系.这可生成低级别的编程模型,在该模型中,您首先定义数据流图,然后创建TensorFlow会话,以便在一组本地和远程设备上运行图 ...

  5. spark streaming kafka1.4.1中的低阶api createDirectStream使用总结

    转载:http://blog.csdn.net/ligt0610/article/details/47311771 由于目前每天需要从kafka中消费20亿条左右的消息,集群压力有点大,会导致job不 ...

  6. 【OpenJudge3531】【背包DP】【膜法交配律】判断整除

    判断整除 总时间限制: 1000ms 内存限制: 65536kB [描述] 一个给定的正整数序列,在每个数之前都插入+号或-号后计算它们的和.比如序列:1.2.4共有8种可能的序列:(+1) + (+ ...

  7. [luogu3767]膜法

    [luogu3767]膜法 luogu 神仙题 线段树分治+带权并查集 把每个操作看成点 首先这个操作的结构是一棵树 你发现每个点的对它的子树产生影响 我们可以想到用dfn序把它转成一段区间用线段树分 ...

  8. TensorFlow低阶API(一)—— 简介

    简介 本文旨在知道您使用低级别TensorFlow API(TensorFlow Core)开始编程.您可以学习执行以下操作: 管理自己的TensorFlow程序(tf.Graph)和TensorFl ...

  9. Elasticsearch入门教程(五):Elasticsearch查询(一)

    原文:Elasticsearch入门教程(五):Elasticsearch查询(一) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:h ...

随机推荐

  1. python 抽象类与接口类

    几个类 实现的方法都一致的话 就继承同一个父类 在父类写一个公共方法 给子类使用

  2. BZOJ1559[JSOI2009]密码——AC自动机+DP+搜索

    题目描述 输入 输出 样例输入 10 2 hello world 样例输出 2 helloworld worldhello 提示 这题算是一个套路题了,多个串求都包含它们的长为L的串的方案数. 显然是 ...

  3. BZOJ2795&2890&3647[Poi2012]A Horrible Poem——hash

    题目描述 给出一个由小写英文字母组成的字符串S,再给出q个询问,要求回答S某个子串的最短循环节.如果字符串B是字符串A的循环节,那么A可以由B重复若干次得到. 输入 第一行一个正整数n (n<= ...

  4. Leetcode 26.删除排序数组中的重复项 By Python

    给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. 示例 1 ...

  5. [luogu2522][bzoj2301][HAOI2011]Problem b【莫比乌斯反演】

    传送门:https://www.luogu.org/problemnew/show/P2522 题目描述 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y ...

  6. job.yml

    job.yml apiVersion: batch/v1kind: Jobmetadata: name: myjobspec: completions: 6 parallelism: 2 templa ...

  7. redis中的数据类型

    redis不是一个纯文本kv存储,实际上,它是一个数据结构服务,支持不同类型的value. 包含以下类型: 1.Binary-safe strings. 二进制安全的字符串 2.Lists: coll ...

  8. A1082. Read Number in Chinese

    Given an integer with no more than 9 digits, you are supposed to read it in the traditional Chinese ...

  9. SIFT特征点检测学习一(转载)

    新手上路,先转载学习tornadomeet的博客:http://www.cnblogs.com/tornadomeet/archive/2012/08/16/2643168.html 特征点检测学习_ ...

  10. 数据正规化 (data normalization) 的原理及实现 (Python sklearn)

    原理 数据正规化(data normalization)是将数据的每个样本(向量)变换为单位范数的向量,各样本之间是相互独立的.其实际上,是对向量中的每个分量值除以正规化因子.常用的正规化因子有 L1 ...