Description

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

Input

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

Output

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

Sample Input

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

Sample Output

2
2
4

HINT

  对于20%的数据,N ≤ 100,M ≤ 1000;
  对于40%的数据,N ≤ 3000,M ≤ 200000;
  对于100%的数据,N ≤ 50000,M ≤ 200000。

Source

  Day2

Solution

  挺经典的一道题。

  大体思路是:对于每一个询问区间[l, r],我们只需关注[l, n]中第一次出现的颜色的位置,把答案+1

  nxt[i]存储颜色a[i]的下一个位置在哪,把每一种颜色的第一次出现的位置的答案+1,举例如下:

  a[i]:    1   4   4   2   3   4   3   3   1   2

  ans[i]: 1   1   0   1   1   0   0   0   0   0

  把询问操作按左端点排序,假如现在要执行询问[2, 4],那么ans[1]信息已失效,把a[i]的下一个对应位置更新

  nxt[1] = 9

  a[i]:    1   4   4   2   3   4   3   3   1   2

  ans[i]: 1   1   0   1   1   0   0   0   1   0

  答案就是1 + 0 + 1 = 2

  再加入又要执行询问[6, 9],先更新[2, 5]的下一个的信息(因为a[1]已更新)

  nxt[2] = 3, nxt[3] = 6, nxt[4] = 10, nxt[5] = 7:

  a[i]:    1   4   4   2   3   4   3   3   1   2

  ans[i]: 1   1   1   1   1   1   1   0   1   1

  答案就是1 + 1 + 0 + 1 = 3,以此类推。

  注意到这个方法可以保证每一种颜色在区间内只在第一次出现时被算过一遍。

  复杂度是O(n^2),需用树状数组维护前缀和使复杂度降为O(nlogn)

 #include <bits/stdc++.h>
using namespace std;
struct query
{
int id, l, r, ans;
}q[];
int n, a[], fst[], nxt[], BIT[], ctot; bool cmp1(const query &lhs, const query &rhs)
{
return lhs.l == rhs.l ? lhs.r < rhs.r : lhs.l < rhs.l;
} bool cmp2(const query &lhs, const query &rhs)
{
return lhs.id < rhs.id;
} void update(int x, int val)
{
for(; x <= n; x += x & -x)
BIT[x] += val;
} int query(int x)
{
int ans = ;
for(; x; x -= x & -x)
ans += BIT[x];
return ans;
} int main()
{
int m, l = ;
scanf("%d", &n);
for(int i = ; i <= n; i++)
scanf("%d", a + i), ctot = max(ctot, a[i]);
for(int i = n; i; i--)
nxt[i] = fst[a[i]], fst[a[i]] = i;
for(int i = ; i <= ctot; i++)
if(fst[i]) update(fst[i], );
scanf("%d", &m);
for(int i = ; i <= m; i++)
scanf("%d%d", &q[i].l, &q[i].r), q[i].id = i;
sort(q + , q + m + , cmp1);
for(int i = ; i <= m; i++)
{
while(l < q[i].l - )
if(nxt[++l]) update(nxt[l], );
q[i].ans = query(q[i].r) - query(q[i].l - );
}
sort(q + , q + m + , cmp2);
for(int i = ; i <= m; i++)
printf("%d\n", q[i].ans);
return ;
}

[BZOJ1878] [SDOI2009] HH的项链 (树状数组)的更多相关文章

  1. BZOJ1878 [SDOI2009]HH的项链 树状数组 或 莫队

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1878 题意概括 给出一个长度为n的序列,用m次询问,问区间Li~Ri中有多少种不同的数. 0< ...

  2. bzoj1878 [SDOI2009]HH的项链——树状数组

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1878 离线树状数组,巧妙的思路呢: 给每种项链记录一个最后出现的位置lst,根据项链最后出现 ...

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

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

  4. BZOJ1878: [SDOI2009]HH的项链[树状数组+离线 | 主席树]

    题意: 询问区间不同种类颜色数 [2016-11-15] 离线好厉害 对于每一个区间询问,一个数只考虑一次,那么考虑他最后出现的一次 将询问按r排序 从1到n扫描,用树状数组维护一个位置应不应该考虑( ...

  5. 【bzoj1878】[SDOI2009]HH的项链 树状数组

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

  6. 【bzoj1878】[SDOI2009]HH的项链 - 树状数组 - 离线处理

    [SDOI2009]HH的项链 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 4834  Solved: 2384[Submit][Status][Dis ...

  7. 【题解】P1972 [SDOI2009]HH的项链 - 树状数组

    P1972 [SDOI2009]HH的项链 声明:本博客所有题解都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。 题目描述 \(HH\) 有一串由各种 ...

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

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

  9. [SDOI2009]HH的项链 树状数组 BZOJ 1878

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

随机推荐

  1. shell编程之环境变量配置文件(4)

    1 source命令 修改了配置文件,并让它立刻生效,而不用重新登录 source 配置文件 或者 .配置文件 2 环境变量配置文件简介 PATH HISTSIZE PS1 HOSTNAME等环境变量 ...

  2. 从此不再担心键盘遮住输入框OC(

    从此不再担心键盘遮住输入框OC(二) 字数544 阅读1492 评论15 喜欢25 在我发布这篇文章没多久之前,我发布了一篇叫 从此不再担心键盘遮住输入框OC(一)的文章.我在那篇文章中介绍了我的键盘 ...

  3. ansible安装

    本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 1.配置epel源 wget -O /etc/yum.repos.d ...

  4. NDK开发,如何配置 debug环境

    刚开始做NDK 开发的时候,Android Studio 还没提供了 native C/C++ 设置断点 调试,我们都是通过输出 日志来调试,这样费时耗力.Android Studio 应该是在 2. ...

  5. Zabbix 3.2.4至3.2.7的升级方案

    1.关闭Zabbix Server 防止有新的数据提交到数据库中,也可以关闭数据库.如果更新过程中,评估告警信息可以忽略,可以先执行备份操作. 1.1.检查当前版本 /usr/local/zabbix ...

  6. Egret学习笔记 (Egret打飞机-5.实现子弹对象)

    上一章把飞机添加到屏幕上,但是飞机要发射子弹对吧?那么这一章我们就来实现一下发射子弹,并实现一个简单的子弹对象池 先来捋一捋思路 1.创建一个子弹对象 2.然后添加一个bitmap,显示子弹贴图 3. ...

  7. filebeat -> logstash -> elasticsearch -> kibana ELK 日志收集搭建

    Filebeat 安装参考 http://blog.csdn.net/kk185800961/article/details/54579376 elasticsearch 安装参考http://blo ...

  8. javascript模块化编程库require.js的用法

    随着javascript的兴起,越来越多的公司开始将JS模块化,以增加开发的效率和减少重复编写代码的.更是为了能更加容易的维护日后的代码,因为现在的随着人们对交互效果的越来越强烈的需求,我们的JS代码 ...

  9. Shell脚本——特殊符号

    1. # 井号(pound) 脚本文件运行时,使用的解释器. #!/bin/sh 其他时候表示注释. # This is a comment. 2. ~ 波浪号(tilde) 表示当前用户使用的hom ...

  10. HTML入门标签汇总

    HTML入门标签汇总 1.<div></div>用于定义文档的区块,用来划分出独立不同的部分. 2.<h1></h1>数字1-6定义从大到小的标题. 3 ...