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

Hint

题意:

有一串项链,每点有个颜色,给你个区间。查询这个区间内有几种不同的颜色?

思路:

预处理出上一个与i颜色相同的点pre[i],将询问按右端点排序,然后一边往树状数组进入点一边处理询,注意其中一些小技巧。

代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int n,m,sum;
const int maxn=1000010;
int pre[maxn],s[maxn],p[maxn],head[maxn],ans[maxn];
struct Q
{int l,r,id;
}q[maxn];
bool cmp(Q a,Q b)
{return a.r<b.r;
}
int lowbit(int i){return i&-i;
}
void updata(int x,int v)   //单点更新
{if(!x)  return ;sum+=v;                //记录的更新的次数//  cout<<sum<<"......"<<endl;while(x<=n){s[x]+=v;x+=lowbit(x);
}}
int query(int x) //查询0-x和
{int i,res=0;while(x>0){res+=s[x];x-=lowbit(x);
}return res;
}
int main()
{scanf("%d",&n);int i,j;for(i=1;i<=n;i++){scanf("%d",&p[i]);pre[i]=head[p[i]];  //仔细理解head[p[i]]=i;}scanf("%d",&m);for(i=1;i<=m;i++)    scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i;sort(q+1,q+m+1,cmp);for(i=j=1;i<=m;i++){for(;j<=q[i].r;j++) updata(pre[j],-1),updata(j,1);  //核心处ans[q[i].id]=sum-query(q[i].l-1);}for(i=1;i<=m;i++)    printf("%d\n",ans[i]);return 0;
}

多看 多学 多想

HH的项链(树状数组)区间内不同的数量相关推荐

  1. bzoj 1878: [SDOI2009]HH的项链 ——树状数组+ 差分

    Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一 段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此他的项链变得 ...

  2. UESTC 1601 艾尔大停电2 二维树状数组+区间更新

    艾尔大停电2 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  S ...

  3. 校门外的树——树状数组+区间修改

    校门外的树 [题目分析]题目描述的是一种区间修改,看起来好像要用线段树.但是对于这种区间内部没有差别并且查询的是区间内的类别的问题,是可以转化为树状数组进行的.毕竟树状数组更加简单. 我们的关注点应该 ...

  4. HDU 4031 Attack(线段树/树状数组区间更新单点查询+暴力)

    Attack Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) Total Sub ...

  5. 树状数组 区间update/query

    Re [问题引入] 对于区间修改.区间查询这样的简单问题,打一大堆线段树确实是不划算,今天来介绍一下区间查询+区间修改的树状数组 [一些基础] 树状数组的基本知识不再介绍,请自行百度 我们假设sigm ...

  6. hdu3966 树链剖分点权模板+线段树区间更新/树状数组区间更新单点查询

    点权树的模板题,另外发现树状数组也是可以区间更新的.. 注意在对链进行操作时方向不要搞错 线段树版本 #include<bits/stdc++.h> using namespace std ...

  7. hdu 1556:Color the ball(第二类树状数组 —— 区间更新,点求和)

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  8. 树状数组区间修改和区间求和

    最一般树状数组能做到的操作是单点修改,区间求和,都是log(n)级别的.原理就是用树状数组维护a[i]的部分和. 想要做到修改区间,求单点值也很简单,用树状数组维护a[i]的差分数组d[i]的部分和既 ...

  9. Color the ball(树状数组区间更新+单点求值)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556 Color the ball Time Limit: 9000/3000 MS (Java/Ot ...

  10. 树状数组 区间加 区间求和_EXCEL统计区间个数的专属函数

    这次我们学习一个新的函数! 数字区间个数统计 如下图,要求统计四个成绩区间段的人数. 如果只统计一个区间内的人数,比如上图统计60-80分之间的人数,你会怎么办呢? 1.条件计数 =COUNTIF(B ...

最新文章

  1. 学AI哪家强?清华全球第1,Top5中有这3所中国高校
  2. cmd:计算机cmd常用命令集合之详细攻略daiding
  3. python 生成001开始的序号_你知道嘛:Python内建序列通用操作有6种实现方法(赶快收藏)...
  4. shiro的内部体系结构
  5. jQuery随笔1-CDN加载
  6. eclipse开发web应用程序步骤(图解)
  7. 简单说说驱动程序设计的入门
  8. 蒙特卡洛积分(Monte Carlo Integration)应用:利用蒙特卡洛积分生成 McBeth表
  9. 2021了,不会还有测试人员认为Jmeter就等于性能测试吧!
  10. word双引号间距大_微软判定:Word 编辑英文句号后“两个空格”为拼写异常
  11. SAP License:做系统要关注业务过程
  12. 移动管理进步显著 企业仍然面临风险
  13. STL模板之vector与sort的使用
  14. Hibernate数据查询
  15. html字体重叠的原因,PPT输入文字的时候字重叠是怎么回事呢?
  16. 先试试这一招,再决定是否要撬开拉杆箱的密码锁——巧开密码锁
  17. idea打包meven镜像_docker打包maven项目推送到阿里云镜像仓库
  18. 这2个在线资源网千万别错过,老司机人手一份,一年省下好几千
  19. c语言图书馆管理程的运行截图,c语言图书管理系统
  20. 淘宝店铺商品发布API(新)接口,店铺上传接口代码对接教程

热门文章

  1. CefSharp截取完整网页图片,网页截图
  2. 入股不亏的文案编辑工具
  3. java pdf转jpg_java pdf转换jpg
  4. 运用Python——劳拉下棋_四连环游戏_重力四子棋游戏(代码与游戏判定)
  5. 用css解决文本折行问题
  6. perl pack和unpack的使用详解
  7. Android 贯穿Activity的全局变量定义
  8. 微信小程序base64转为二维码、条形码图片
  9. 菜鸟必看IPC空连接的使用(转载)
  10. 药品零售企业未建立计算机系统,新版GSP药品经营企业计算机系统要求