题意查询区间 [l,r]内有多少个不同的数字

先把所有询问按 右端点进行排序,然后离线操作。如果该位置的数字 已经出现过那么把前一个位置-1,当前位置+1。扫一遍输出。

  1. #include <cstdio>
  2. #include <string>
  3. #include <vector>
  4. #include <cstdlib>
  5. #include <cstring>
  6. #include <algorithm>
  7. using namespace std;
  8.  
  9. const int maxq = 2e5+;
  10. const int maxn = 3e4+;
  11. int last[];
  12. int n,m,c[maxn],ans[];
  13. struct Node
  14. {
  15. int l,r,ans,idx;
  16. bool operator < (const Node &rhs)const
  17. {
  18. return r < rhs.r || (r == rhs.r && l < rhs.l);
  19. }
  20. }Q[maxq];
  21. int lowbit(int x)
  22. {
  23. return x & -x;
  24. }
  25. void add(int x,int d)
  26. {
  27. while (x <= maxn)
  28. {
  29. c[x] += d;
  30. x += lowbit(x);
  31. }
  32. }
  33. int sum(int x)
  34. {
  35. int ans = ;
  36. while (x)
  37. {
  38. ans += c[x];
  39. x -= lowbit(x);
  40. }
  41. return ans;
  42. }
  43. int a[maxq];
  44. int main(void)
  45. {
  46. #ifndef ONLINE_JUDGE
  47. freopen("in.txt","r",stdin);
  48. #endif
  49. while (~scanf ("%d",&n))
  50. {
  51. memset(c,,sizeof(c));
  52. memset(last,-,sizeof(last));
  53. for (int i = ; i <= n+; i++)
  54. scanf ("%d",a+i);
  55. scanf ("%d",&m);
  56. for (int i = ; i < m; i++)
  57. {
  58. Q[i].idx = i;
  59. scanf ("%d%d",&Q[i].l,&Q[i].r);
  60. Q[i].l++,Q[i].r++;
  61. }
  62. sort(Q,Q+m);
  63. int pre = ;
  64. for (int i = ; i < m; i++)
  65. {
  66. for(int j = pre; j <= Q[i].r; j++)
  67. {
  68. if (~last[a[j]])
  69. {
  70. add(last[a[j]],-);
  71. add(j,);
  72. }
  73. else
  74. {
  75. add(j,);
  76. }
  77. last[a[j]] = j;
  78. }
  79. ans[Q[i].idx] = sum(Q[i].r) - sum(Q[i].l - );
  80. pre = Q[i].r+;
  81. }
  82. for (int i = ; i < m; i++)
  83. printf("%d\n",ans[i]);
  84. }
  85. return ;
  86. }

此题主席树也可以做。

SPOJ3267--D-query (树状数组离线操作)的更多相关文章

  1. HDU3874Necklace(树状数组+离线操作)

    此题的大意思说有一串珠子,每个珠子都有自己的欣赏值value,现在给你一串珠子每个的欣赏值,并给出一些询问,查询某个区间内部总欣赏值是多少,但是有一个约定就是如果这个区间内部有两个珠子的欣赏值是一样的 ...

  2. HDU 5869 Different GCD Subarray Query 树状数组+离线

    Problem Description This is a simple problem. The teacher gives Bob a list of problems about GCD (Gr ...

  3. HDU---4417Super Mario 树状数组 离线操作

    题意:给定 n个数,查询 位置L R内 小于x的数有多少个. 对于某一次查询 把所有比x小的数 ”的位置“ 都加入到树状数组中,然后sum(R)-sum(L-1)就是答案,q次查询就要离线操作了,按高 ...

  4. HDU 5869 Different GCD Subarray Query 树状数组 + 一些数学背景

    http://acm.hdu.edu.cn/showproblem.php?pid=5869 题意:给定一个数组,然后给出若干个询问,询问[L, R]中,有多少个子数组的gcd是不同的. 就是[L, ...

  5. hdu 3333(树状数组 + 离线操作)

    Turing Tree Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  6. HDU 4630 No Pain No Game 树状数组+离线操作

    题意:给一串数字,每次查询[L,R]中两个数的gcd的最大值. 解法:容易知道,要使取两个数让gcd最大,这两个数最好是倍数关系,所以处理出每个数的所有倍数,两两间根据倍数关系形成一条线段,值为该数. ...

  7. Codeforces 369E Valera and Queries --树状数组+离线操作

    题意:给一些线段,然后给m个查询,每次查询都给出一些点,问有多少条线段包含这个点集中的一个或多个点 解法:直接离线以点为基准和以线段为基准都不好处理,“正难则反”,我们试着求有多少线段是不包含某个查询 ...

  8. bzoj 1878 SDOI2009树状数组 离线操作

    本来想写2120的,结果想起来了这个 我们先对于询问左端点排序,用树状数组存区间字母个数,对于每种字母, 第一次出现的位置记录为1,剩下的记录为0,然后记录下,每种颜色 后面第一个和他相同颜色的位置 ...

  9. SPOJ3267 D-query 离线+树状数组 在线主席树

    分析:这个题,离线的话就是水题,如果强制在线,其实和离线一个思路,然后硬上主席树就行了 离线的代码 #include <iostream> #include <stdio.h> ...

随机推荐

  1. [Angular 2] Managing State in RxJS with StartWith and Scan

    The scan operator in RxJS is the main key to managing values and states in your stream. Scan behaves ...

  2. 外键约束列并没有导致大量建筑指数library cache pin/library cache lock

    外键约束列并没有导致大量建筑指数library cache pin/library cache lock 清除一个100大数据表超过一百万线,发现已经运行了几个小时: delete B001.T_B1 ...

  3. udp协议基础(转自疯狂java讲义)

    第17章  网络编程 17.4  基于UDP协议的网络编程 UDP协议是一种不可靠的网络协议,它在通信实例的两端各建立一个Socket,但这两个Socket之间并没有虚拟链路,这两个Socket只是发 ...

  4. Android Studio导入GitHub上的项目常见问题(以图片轮播开源项目为实例)

    前言:github对开发者而言无疑是个宝藏,但想利用它可不是件简单的事,用Android studio导入开源项目会遇到各种问题,今天我就以github上的一个图片轮播项目为例,解决导入过程中的常见问 ...

  5. Webpack 基本环境搭建

    1. 第一步安装之前 先npm init 创建 package.json cnpm init; 然后全局安装 cnpm install webpack -g 确保哪里都可以使用 cnpm instal ...

  6. vim命令---存阅

    命令历史 以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令. 启动vim 在命令行窗口中输入以下命令即可 vim 直接启动vim vim filename 打开vim ...

  7. 快速使用shortcut,适配各种ROM

    地址(徐医生的GitHub):https://github.com/xuyisheng/ShortcutHelper 常用API     /**      * 添加快捷方式      *      * ...

  8. C#学习(三)

    通过类创建对象的过程称为类的实例化 匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型. 要将匿名类型或包含匿名类型的集合作为参数传递给某一方法,可将参数作 ...

  9. 安装VS2013的离线MSDN帮助文档

    作为vs的初学者,安装帮助文档有利于快速掌握.net的基本语法,对于摸索学习的同学帮助很大. VS2013和VS2012的帮助文档目前为止还是一样 下面是下载地址    http://www.micr ...

  10. Asp.Net Mvc MapRoute .html不起作用(转)

    RegisterRoutes 注册路由示例配置: public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRo ...