ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LuoguP1972 [SDOI2009]HH的项链

2021-07-16 07:32:32  阅读:214  来源: 互联网

标签:树状 int 询问 leq HH 数组 SDOI2009 include LuoguP1972


题面

序列,多次查询区间中有多少不同的数

\(1\leq n, m, a_i\leq10^6, 1\leq l\leq r\leq n\)

solution

这题把莫队卡了? 好像有dalao用莫队卡常过了,莫队是啥,早忘咋写了 = =

本蒟蒻只会用树状数组

根据询问查找题目中一些特殊的性质

由于询问的是区间的种类数,所以只需要每个数在该区间出现一次就够了

所以我们只关心每个数在区间中最后一次出现的位置

对询问离散化,把它们按照右端点排序,然后扫一遍,开一个树状数组把新出现的颜色种类++,重复出现的颜色种类--,显然树状数组的添加是动态的,不能一次性就建好,所以开一个指针,每次询问都把指针移到右端点,并把路径上的点加入到树状数组中就好了

code

    /*
    work by:Ariel_
    */
    #include<iostream>
    #include<cstdio>
    #include<map>
    #include<algorithm>
    using namespace std;
    const int N = 1e6 + 5;
    int read() {
      int x = 0, f = 1; char c = getchar();
      while(c < '0' || c > '9'){if (c == '-') f = -1;c = getchar();}
      while(c >= '0' && c <= '9') {x = x * 10 + c - '0';c = getchar();}
      return x * f;
    }
    map<int, int>last;
    int n, tree[N], a[N], m, Ans[N], p = 1;
    struct Node{int l, r, id;}A[N];
    void Insert(int x, int k) {
      for (int i = x; i <= n; i += i & (-i))  tree[i] += k;
    } 
    int Query(int x) {
      int res = 0;
      for (int i = x; i; i -= i & (-i)) res += tree[i];
      return res;	
    }
    bool cmp(Node x, Node y) {
      if (x.r == y.r) return x.l < y.l;
      return x.r < y.r;
    }
    int main(){
      n = read(); 
      for (int i = 1; i <= n; i++) a[i] = read();
      m = read();
      for (int i = 1; i <= m; i++)
      	A[i].l = read(), A[i].r = read(), A[i].id = i;
      sort(A + 1, A + m + 1, cmp);
      for (int i = 1; i <= m; i++) {
      	while (p <= A[i].r) {
      	 	   if (last[a[p]]) Insert(last[a[p]], -1);
      	 	   Insert(last[a[p]] = p, 1);
      	 	   p++;
    	   }
        Ans[A[i].id] = Query(A[i].r) - Query(A[i].l - 1); 
      }
      for (int i = 1; i <= m; i++) printf("%d\n", Ans[i]);
      puts("");
      return 0;
    }

标签:树状,int,询问,leq,HH,数组,SDOI2009,include,LuoguP1972
来源: https://www.cnblogs.com/Arielzz/p/15018359.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有