链接:SPOJ - DQUERY

题意:求给定区间不同数的个数(不更新)。

题解:离线+树状数组。

   对所求的所有区间(l, r)根据r从小到大排序。从1-n依次遍历序列数组,在树状数组中不断更新a[i]出现的最后一个位置。更新:将a[i]所在位置i在树状数组中加1(add(i, 1)),并消去a[i]上次出现的位置上的1(add(lasta[i], -1))。当遍历到i == r时,就保存答案(sum[r] - sum[l-1])。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int maxn = 2e6 + ;
  5. int n, q;
  6. int a[maxn];
  7. int bit[maxn];
  8. struct Node{
  9. int l, r, id;
  10. bool operator < (const Node& A) const
  11. {
  12. return r < A.r;
  13. }
  14. }p[maxn];
  15. int last[maxn];
  16. int ans[maxn];
  17.  
  18. void add(int i, int x)
  19. {
  20. while(i > && i < maxn){
  21. bit[i] += x;
  22. i += i & -i;
  23. }
  24. }
  25.  
  26. int sum(int i)
  27. {
  28. int ans = ;
  29. while(i){
  30. ans += bit[i];
  31. i -= i & -i;
  32. }
  33. return ans;
  34. }
  35.  
  36. int main()
  37. {
  38. while(scanf("%d", &n) != EOF){
  39.  
  40. memset(bit, , sizeof(bit));
  41. memset(last, -, sizeof(last));
  42. int tot = ;
  43. for(int i = ; i <= n; i++) scanf("%d", &a[i]);
  44. scanf("%d", &q);
  45. for(int i = ; i < q; i++){
  46. scanf("%d%d", &p[i].l, &p[i].r);
  47. p[i].id = i;
  48. }
  49. sort(p, p + q); //区间排序
  50.  
  51. memset(ans, , sizeof(ans));
  52. for(int i = , k = ; i <= n; i++){
  53. //更新a[i]出现的最后一个位置
  54. if(last[a[i]] != -){
  55. add(last[a[i]], -);
  56. add(i, );
  57. last[a[i]] = i;
  58. }
  59. else{
  60. last[a[i]] = i;
  61. add(i, );
  62. }
  63.  
  64. //保存答案
  65. while(k < q && p[k].r == i){
  66. ans[p[k].id] = sum(p[k].r) - sum(p[k].l - );
  67. k++;
  68. }
  69. }
  70.  
  71. for(int i = ; i < q; i++) printf("%d\n", ans[i]);
  72. }
  73. }

SPOJ - DQUERY(区间不同数+树状数组)的更多相关文章

  1. 牛客网暑期ACM多校训练营(第一场):J-Different Integers(分开区间不同数+树状数组)

    链接:J-Different Integers 题意:给出序列a1, a2, ..., an和区间(l1, r1), (l2, r2), ..., (lq, rq),对每个区间求集合{a1, a2, ...

  2. ACM学习历程—51NOD 1685 第K大区间2(二分 && 树状数组 && 中位数)

    http://www.51nod.com/contest/problem.html#!problemId=1685 这是这次BSG白山极客挑战赛的E题. 这题可以二分答案t. 关键在于,对于一个t,如 ...

  3. hdu-5700 区间交(二分+树状数组)

    题目链接: 区间交 Problem Description   小A有一个含有n个非负整数的数列与mm个区间.每个区间可以表示为l​i​​,r​i​​. 它想选择其中k个区间, 使得这些区间的交的那些 ...

  4. D 区间求和 [数学 树状数组]

    D 区间求和 题意:求 \[ \sum_{k=1}^n \sum_{l=1}^{n-k+1} \sum_{r=l+k-1}^n 区间前k大值和 \] 比赛时因为被B卡了没有深入想这道题 结果B没做出来 ...

  5. hdu 1166 敌兵布阵——(区间和)树状数组/线段树

    pid=1166">here:http://acm.hdu.edu.cn/showproblem.php?pid=1166 Input 第一行一个整数T.表示有T组数据. 每组数据第一 ...

  6. SPOJ - FTOUR2 (点分治+树状数组)

    题目:https://vjudge.net/contest/307753#problem/I 题意:有一颗树,上面有白色黑色点,每个点上有一个权值,权值可以为负,现在我要求一条路径,权值和最大,这条路 ...

  7. FZU2224 An exciting GCD problem 区间gcd预处理+树状数组

    分析:(别人写的) 对于所有(l, r)区间,固定右区间,所有(li, r)一共最多只会有log个不同的gcd值, 可以nlogn预处理出所有不同的gcd区间,这样区间是nlogn个,然后对于询问离线 ...

  8. hdu 4911 求逆序对数+树状数组

    http://acm.hdu.edu.cn/showproblem.php?pid=4911 给定一个序列,有k次机会交换相邻两个位置的数,问说最后序列的逆序对数最少为多少. 实际上每交换一次能且只能 ...

  9. SPOJ - MATSUM Matrix Summation---二维树状数组

    题目链接: https://vjudge.net/problem/SPOJ-MATSUM 题目大意: 二维数组,两种操作 SET 将某点设置成x SUM 求某个区域之和 解题思路: 这里用二维树状数组 ...

随机推荐

  1. ABI是编译器的开发指南

    http://blog.csdn.net/soaringlee_fighting/article/details/70214785 1) ABI: 二进制应用程序接口(Application Bina ...

  2. OpenCV2马拉松第5圈——线性滤波

    收入囊中 这里的非常多内容事实上在我的Computer Vision: Algorithms and ApplicationsのImage processing中都有讲过 相关和卷积工作原理 边界处理 ...

  3. sql查询字段值长度判断是否18位

    SELECT * FROM 表名 WHERE LENGTH(字段)= OR 字段为null IS NULL OR 字段为空='' SELECT * FROM 表名 WHERE LENGTH(字段)&g ...

  4. apache单ip配置多端口多站点

    1.修改 /etc/httpd/conf/httpd.conf 添加一个Listen,如: Listen 80 Listen 8001 Listen 8002 2.添加一个VirtualHost #v ...

  5. Oracle 启动 停止JOB

    转自:https://www.cnblogs.com/qianbing/p/6971633.html --查看job下次执行时间以及间隔时间 '; --启动job ); --停用job EXEC DB ...

  6. Go标准库学习之OS常用函数

    1.OS基础操作 //获取主机名 os.Hostname() //获取当前目录 os.Getwd() //获取用户ID os.Getuid() //获取有效用户ID os.Geteuid() //获取 ...

  7. 关于img底部空白

    <img>元素底部为何有空白? 问题: 最近听网课遇到这样一个问题,先po出代码如下: <!--html--> <div class="top"> ...

  8. ECMAscript6(ES6)新特性语法总结(一)

    ES6/ES2015,,在ES5的基础上扩展了很多新的功能,在使用的时候要慎重,因为有一部分js代码在部分浏览器是不兼容的,但是所有写在服务器端的代码基本上都支持ES6的写法. 新特性: 一.开启严格 ...

  9. Spring框架基础2

    Spring框架基础2 测试Spring的AOP思想和注解的使用 导包(在前面的基础上添加) SpringAOP名词解释 AOP编程思想:横向重复代码,纵向抽取:就是说多个地方重复的代码可以抽取出来公 ...

  10. JAVA实现RSA加密,非对称加密算法

    RSA.java package org.icesnow.jeasywx.util.security; import java.security.Key; import java.security.K ...