1878: [SDOI2009]HH的项链

题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1878

Description:

HH有一串由各种漂亮的贝壳组成的项链。HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一段贝壳,思考它们所表达的含义。HH不断地收集新的贝壳,因此他的项链变得越来越长。有一天,他突然提出了一个问题:某一段贝壳中,包含了多少种不同的贝壳?这个问题很难回答。。。因为项链实在是太长了。于是,他只好求助睿智的你,来解决这个问题。

Input:

第一行:一个整数N,表示项链的长度。 
第二行:N个整数,表示依次表示项链中贝壳的编号(编号为0到1000000之间的整数)。 
第三行:一个整数M,表示HH询问的个数。 
接下来M行:每行两个整数,L和R(1 ≤ L ≤ R ≤ N),表示询问的区间。
N ≤ 50000,M ≤ 200000。

Output:

M行,每行一个整数,依次表示询问对应的答案。

Sample Input:

6
1 2 3 4 3 5
3
1 2
3 5
2 6

Sample Output:

2
2
4

题解:

emm...并没有练数据结构但独立解出来了一道数据结构相关的题,心里还是蛮开心的O(∩_∩)O

其实这个也不难,这个题直接在线询问不好处理,所以我们就考虑离线询问。将询问区间按右端点从小到大进行排序,然后从1开始往右逐个进行遍历,每次遇到一个未出现过的数字,就用树状数组对该位置+1;如果遇到一个出现过的字符,那么我们肯定会舍去其之前的位置,然后选择现在的位置。这些操作都可以通过树状数组来完成。

当指针到询问的右端点时,利用树状数组查询区间和就行了。

代码如下:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <iostream>
  5. #include <cmath>
  6. using namespace std;
  7. typedef long long ll;
  8. const int N = ,M = ,MAX=;
  9. int n,m;
  10. int a[N],c[N],b[M];
  11. int pos[MAX];
  12. int lowbit(int x){
  13. return x&(-x);
  14. }
  15. void add(int x,int p){
  16. for(int i=x;i<=;i+=lowbit(i)) c[i]+=p;
  17. }
  18. int query(int x){
  19. int ans = ;
  20. for(int i=x;i>;i-=lowbit(i)) ans+=c[i];
  21. return ans ;
  22. }
  23. struct Qeury{
  24. int l,r,id;
  25. bool operator < (const Qeury &A)const{
  26. if(r==A.r) return l<A.l;
  27. return r<A.r;
  28. }
  29. }q[M];
  30. int main(){
  31. scanf("%d",&n);
  32. for(int i=;i<=n;i++){
  33. scanf("%d",&a[i]);
  34. a[i]++;
  35. }
  36. scanf("%d",&m);
  37. for(int i=;i<=m;i++){
  38. scanf("%d%d",&q[i].l,&q[i].r);
  39. q[i].id=i;
  40. }
  41. sort(q+,q+m+);
  42. int cnt = ;
  43. for(int i=;i<=n;i++){
  44. if(pos[a[i]]){
  45. add(pos[a[i]],-);
  46. add(i,);
  47. pos[a[i]]=i;
  48. }else{
  49. add(i,);
  50. pos[a[i]]=i;
  51. }
  52. while(i==q[cnt].r){
  53. int l=q[cnt].l,r=q[cnt].r;
  54. int ans = query(r)-query(l-);
  55. b[q[cnt].id]=ans;
  56. cnt++;
  57. }
  58. }
  59. for(int i=;i<=m;i++) printf("%d\n",b[i]);
  60. return ;
  61. }

BZOJ1878: [SDOI2009]HH的项链 (离线查询+树状数组)的更多相关文章

  1. BZOJ 1878 [SDOI2009]HH的项链(扫描线+树状数组)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1878 [题目大意] 给出一个数列,给出m个查询,每次查询一个区间中不相同的数字个数 [ ...

  2. HDU 4746 莫比乌斯反演+离线查询+树状数组

    题目大意: 一个数字组成一堆素因子的乘积,如果一个数字的素因子个数(同样的素因子也要多次计数)小于等于P,那么就称这个数是P的幸运数 多次询问1<=x<=n,1<=y<=m,P ...

  3. ACdream 1127 Base Station (离线查询+树状数组)

    题目链接: http://acdream.info/problem?pid=1127 题目: 移动通信系统中,通信网的建立主要通过基站来完成. 基站可以分为主基站和子基站.子基站和各个移动用户进行连接 ...

  4. bzoj1878: [SDOI2009]HH的项链(主席树/离线+BIT)

     这题有离线和在线两种做法.  离线:将查询区间按左端点排序,预处理出所有数下一次的出现位置,一开始将所有第一次出现的数a[i]++,之后当扫到这个数的时候a[next[i]]++,相当于差分,给之后 ...

  5. BZOJ 1878: [SDOI2009]HH的项链 离线树状数组

    1878: [SDOI2009]HH的项链 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...

  6. BZOJ1878 SDOI2009 HH的项链 【莫队】

    BZOJ1878 SDOI2009 HH的项链 Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一段贝壳,思考它们所表达的 ...

  7. 【bzoj4540】[Hnoi2016]序列 单调栈+离线+扫描线+树状数组区间修改区间查询

    题目描述 给出一个序列,多次询问一个区间的所有子区间最小值之和. 输入 输入文件的第一行包含两个整数n和q,分别代表序列长度和询问数.接下来一行,包含n个整数,以空格隔开,第i个整数为ai,即序列第i ...

  8. 【loj6041】「雅礼集训 2017 Day7」事情的相似度 后缀自动机+STL-set+启发式合并+离线+扫描线+树状数组

    题目描述 给你一个长度为 $n$ 的01串,$m$ 次询问,每次询问给出 $l$ .$r$ ,求从 $[l,r]$ 中选出两个不同的前缀的最长公共后缀长度的最大值. $n,m\le 10^5$ 题解 ...

  9. BZOJ1878: [SDOI2009]HH的项链[树状数组 离线]

    1878: [SDOI2009]HH的项链 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 3486  Solved: 1738[Submit][Statu ...

随机推荐

  1. lintcode514 栅栏染色

    栅栏染色 我们有一个栅栏,它有n个柱子,现在要给柱子染色,有k种颜色可以染.必须保证不存在超过2个相邻的柱子颜色相同,求有多少种染色方案. 注意事项 n和k都是非负整数 您在真实的面试中是否遇到过这个 ...

  2. Redis命令续

     Redis 集合命令 下表列出了 Redis 集合基本命令: 序号 命令及描述 1 SADD key member1 [member2] 向集合添加一个或多个成员 2 SCARD key 获取集合的 ...

  3. js如何判断客户端是iOS还是Android等移动终端

    判断原理:JavaScript是前端开发的主要语言,我们可以通过编写JavaScript程序来判断浏览器的类型及版本.JavaScript判断浏览器类型一般有两种办法,一种是根据各种浏览器独有的属性来 ...

  4. LeetCode 120——三角形最小路径和

    1. 题目 2. 解答 详细解答方案可参考北京大学 MOOC 程序设计与算法(二)算法基础之动态规划部分. 从三角形倒数第二行开始,某一位置只能从左下方或者右下方移动而来,因此,我们只需要求出这两者的 ...

  5. SpringBoot在IDEA下使用JPA

    1依赖 使用IDEA构建基于JPA的项目需要引用JPA.MYSQL依赖 2配置文件修改 2.1连接库 spring.datasource.url=jdbc:mysql://localhost:3306 ...

  6. POJ 3525/UVA 1396 Most Distant Point from the Sea(二分+半平面交)

    Description The main land of Japan called Honshu is an island surrounded by the sea. In such an isla ...

  7. 2018-9-25kanboard安装及使用

    2018-9-25kanboard安装及使用 教程 小书匠  欢迎走进zozo的学习之旅. 简介 运行官方docker容器 使用kanboard 简介 Kanboard的安装提供了两种方式一种是直接安 ...

  8. 《梦断代码Dreaming In Code》阅读笔记(一)

    第0章!干得漂亮! 这是我看到这本书冒出来的第一个想法.身为计算机系的学生,对于从0开始的任何事情,都感到格外亲切. 进入阅读之后,疑惑.惊讶.感叹渐渐取代了之前轻松的心情,原来做软件竟是攀越一座又一 ...

  9. python学习摘要(2)--基本数据类型

    python申请存储空间是动态的.变量如同指针一样指向存储空间.多个变量会指向同一个存储空间(节省空间).当变量改变时,原来的地址单元并不会马上释放.(引用计数自行回收) c/c++根基性语言,想要什 ...

  10. linux后台运行之screen和nohup

    3.1 nohup命令 如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令. 该命令可以在你退出帐户/关闭终端之后继续运行相应的进程. nohup就是不挂起的意 ...