一 题目

  D-query

二 分析

  主席树的运用。

  这题首先应该考虑的是,如何分出种类数?再就是考虑如何维护区间信息?

  最开始想的是直接离散化后用权值线段树建主席树,发现不行,因为假如$ [l,r] $的值在$l$之前已经出现了,那么直接用历史版本的相减肯定会出问题。所以排除此方法。

  所以在维护历史版本的时候要同时更新各个种类值的最新位置。这样就保证了,在给定$[l,r]$后就可以根据$r$位置的权值线段树,找到比$l$大的数目就是答案。

三 AC代码

  1. 1 #include <bits/stdc++.h>
  2. 2
  3. 3 using namespace std;
  4. 4
  5. 5 const int MAXN = 3e4 + 15;
  6. 6 int n, q, a[MAXN], root[MAXN], tot;
  7. 7 struct Node
  8. 8 {
  9. 9 int l, r, c;
  10. 10 }T[MAXN*30];
  11. 11
  12. 12 void build(int &rt, int l, int r)
  13. 13 {
  14. 14 T[++tot].c = 0;
  15. 15 rt = tot;
  16. 16 if(l == r) return;
  17. 17 int mid = (l+r)>>1;
  18. 18 build(T[rt].l, l, mid);
  19. 19 build(T[rt].r, mid + 1, r);
  20. 20 }
  21. 21 void update(int &cur, int pre,int l, int r, int pos, int val)
  22. 22 {
  23. 23 T[++tot] = T[pre];
  24. 24 cur = tot;
  25. 25 T[cur].c += val;
  26. 26 if(l == r) return;
  27. 27 int m = (l + r) >> 1;
  28. 28 if(pos <= m)
  29. 29 update(T[cur].l, T[pre].l, l, m, pos, val);
  30. 30 else
  31. 31 update(T[cur].r, T[pre].r, m + 1, r, pos, val);
  32. 32 }
  33. 33 int query(int rt, int l, int r, int pos)
  34. 34 {
  35. 35
  36. 36 if(l >= pos) return T[rt].c;
  37. 37 int ans = 0;
  38. 38 int m = (l + r) >>1;
  39. 39 if(pos <= m)
  40. 40 {
  41. 41 ans += T[T[rt].r].c;
  42. 42 ans += query(T[rt].l, l, m, pos);
  43. 43 }
  44. 44 else
  45. 45 {
  46. 46 ans += query(T[rt].r, m + 1, r, pos);
  47. 47 }
  48. 48 return ans;
  49. 49 }
  50. 50 int main()
  51. 51 {
  52. 52 //freopen("in.txt", "r", stdin);
  53. 53 scanf("%d", &n);
  54. 54 for(int i = 1; i <= n; i++)
  55. 55 {
  56. 56 scanf("%d", &a[i]);
  57. 57 }
  58. 58 tot = 0;
  59. 59 build(root[0], 1, n);
  60. 60 map<int, int> mp;
  61. 61 for(int i = 1; i <= n; i++)
  62. 62 {
  63. 63 if(mp.find(a[i]) == mp.end())
  64. 64 update(root[i], root[i-1], 1, n, i, 1);
  65. 65 else
  66. 66 {
  67. 67 int tmp;
  68. 68 update(tmp, root[i-1], 1, n, mp[a[i]], -1);
  69. 69 update(root[i], tmp, 1, n, i, 1);
  70. 70 }
  71. 71 mp[a[i]] = i;
  72. 72 }
  73. 73 scanf("%d", &q);
  74. 74 for(int i = 0; i < q; i++)
  75. 75 {
  76. 76 int x, y;
  77. 77 scanf("%d%d", &x, &y);
  78. 78 printf("%d\n", query(root[y], 1, n, x));
  79. 79 }
  80. 80 return 0;
  81. 81 }

SPOJ D-query 【主席树】的更多相关文章

  1. SPOJ - 3267. D-query 主席树求区间个数

    SPOJ - 3267 主席树的又一种写法. 从后端点开始添加主席树, 然后如果遇到出现过的元素先把那个点删除, 再更新树, 最后查询区间就好了. #include<bits/stdc++.h& ...

  2. SPOJ DQUERY (主席树求区间不同数个数)

    题意:找n个数中无修改的区间不同数个数 题解:使用主席树在线做,我们不能使用权值线段树建主席树 我们需要这么想:从左向右添加一到主席树上,添加的是该数字处在的位置 但是如果该数字前面出现过,就在此版本 ...

  3. 【学术篇】SPOJ COT 树上主席树

    这是学完主席树去写的第二道题_(:з」∠)_ 之前用树上莫队水过了COT2... 其实COT也可以用树上莫队水过去不过好像复杂度要带个log还是怎么样可能会被卡常数.. 那就orz主席吧.... 写了 ...

  4. EC Round 33 F. Subtree Minimum Query 主席树/线段树合并

    这题非常好!!! 主席树版本 很简单的题目,给一个按照指定节点的树,树上有点权,你需要回答给定节点的子树中,和其距离不超过k的节点中,权值最小的. 肯定首先一想,按照dfs序列建树,然后按照深度为下标 ...

  5. Count on a tree SPOJ - COT (主席树,LCA)

    You are given a tree with N nodes. The tree nodes are numbered from 1 to N. Each node has an integer ...

  6. CF893F Subtree Minimum Query 主席树

    如果是求和就很好做了... 不是求和也无伤大雅.... 一维太难限制条件了,考虑二维限制 一维$dfs$序,一维$dep$序 询问$(x, k)$对应着在$dfs$上查$[dfn[x], dfn[x] ...

  7. SPOJ - DQUERY (主席树求区间不同数的个数)

    题目链接:https://vjudge.net/problem/SPOJ-DQUERY 题目大意:给定一个含有n个数的序列,有q个询问,每次询问区间[l,r]中不同数的个数. 解题思路:从左向右一个一 ...

  8. SPOJ - DQUERY D-query 主席树

    题意; 给一个数列$\{ a_i\}$ 一些询问$(l_i,r_i)$ 问你$[l,r]$有多少个不同元素 题解: 其实本质思路和离线化处理询问的线段树/树状数组写法差不多,对区间$[x,r]$来说, ...

  9. SPOJ Query on a tree III (树剖(dfs序)+主席树 || Splay等平衡树)(询问点)

    You are given a node-labeled rooted tree with n nodes. Define the query (x, k): Find the node whose ...

随机推荐

  1. 实现基于股票收盘价的时间序列的统计(用Python实现)

    时间序列是按时间顺序的一组真实的数字,比如股票的交易数据.通过分析时间序列,能挖掘出这组序列背后包含的规律,从而有效地预测未来的数据.在这部分里,将讲述基于时间序列的常用统计方法. 1 用rollin ...

  2. 缓冲区溢出实验 4 内存管理(类似于malloc free)

    实验环境.代码.及准备 https://www.cnblogs.com/lqerio/p/12870834.html vul4 观察foo函数,可见问题在于最后一次tfree(q).由于之前已经tfr ...

  3. Java中输出小数点后几位

    笔试时候,遇到让你写输出小数点后几位,当时很是头疼,下来后,查了查发现,没什么难的.网上有各种情况都讨论了(一般分为4种),在这里我着重讨论一下比较实用,比较简单,比较方便操作的几种: 1 publi ...

  4. 计算机网络 part1 TCP

    一.TCP协议 references:newcoder TCP/IP协议,TCP和UDP的区别及特点 1.四层模型 应用层:载有应用程序,将数据发送给传输层.主要协议有HTTP.SMTP.FTP.DN ...

  5. HDU 3920 Clear All of Them I(状压DP)题解

    题意:2n个点,一个起点,开n枪,每枪必须打两个点,花费为起点到其中一点距离加上两点距离.问打完2n个点的最小花费. 思路:很显然应该dp状态,然后枚举i j两个空位置去填,那么复杂度$O(20 * ...

  6. OpenCV3.2+Python3.5+Ubuntu16.04+缺少boostdesc和vgg_generated

    问题: OpenCV3.2在cmake通过https无法获取boostdesc和vgg_generated2类文件 可尝试的解决方法: 参考, 依其方法至这里做调整, 最后注释xfeatures2d/ ...

  7. OAuth 2.0 All In One

    OAuth 2.0 All In One 授权类型 授权代码 隐式 密码凭证 客户端凭证 授权码 授权码授予类型要求用户向提供者进行身份验证-然后将授权码发送回客户端应用程序,提取并与提供者交换以获取 ...

  8. D language

    D language https://en.wikipedia.org/wiki/D_(programming_language) Dart https://dlang.org/ flutter fr ...

  9. Flutter: 显示&关闭系统叠加层ui

    import 'package:flutter/services.dart'; /// 关闭 SystemChrome.setEnabledSystemUIOverlays([]); /// 显示 S ...

  10. 200万枚SPC空投来袭,这样的薅羊毛活动你确定不参加吗?

    在过去的2020年,币圈真的是很火爆,很多人在参与数字货币交易或DeFi挖矿中赚到了大钱.但是转眼到了2021年,DeFi进入了下半场,区块链市场也进入了新的阶段,那么区块链的下一个爆点是什么呢?很多 ...