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. SpringBoot入门Demo

    前言:相信做java后台编程的童鞋都知道Spring家族,Spring作为我们项目中必备的框架.JavaSpringBoot号称javaEE的颠覆者,这引起了本Y的好奇,这才花费了一点时间,学习了下s ...

  2. linux下利用shell脚本实现添加crontab任务

    本来直接用crontab -e 就可以打开vim,输入要执行的任务保存退出就可以添加任务直接启动运行了.但是今天组长说能不能写个shell不用打开vi就能添加到crontab的. 最先想到的是怎么在s ...

  3. httpd的三种模式比较

    查看你的httpd使用了哪种模式: /usr/local/apache2/bin/httpd -V |grep 'Server MPM' 使用哪种模式,需要在编译的时候指定 --with-mpm=pr ...

  4. 设为首页/加入收藏JS代码

    传统网站常用的设为首页/加入收藏js代码 <a href="javascript:void(0)" onclick="sethome(this,window.loc ...

  5. 数据与C

    //以十进制.八进制和十六进制输出100,加入#会显示前缀#include<stdio.h>int main(){ int x = 100; printf("dec = %d; ...

  6. 捋一捋js面向对象的继承问题

    说到面向对象这个破玩意,曾经一度我都处于很懵逼的状态,那么面向对象究竟是什么呢?其实说白了,所谓面向对象,就是基于类这个概念,来实现封装.继承和多态的一种编程思想罢了.今天我们就来说一下这其中继承的问 ...

  7. SqlBulkCopy 参数配置示例

    SqlBulkCopy  做为SQL Server 官方 批量入库类,性能不会太差.针对其参数做了一些测试.   A. 先准备测试场景 ,关于SqlBulkCopyOptions.KeepIdenti ...

  8. return的新思考

    <!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" ...

  9. Codeforces103D - Time to Raid Cowavans

    Portal Description 给出长度为\(n(n\leq3\times10^5)\)的序列\(\{a_n\}\),进行\(q(q\leq3\times10^5)\)次询问:给出\(x,y\) ...

  10. 使用poi和jfreechart生成excel图表图片

    最近项目在频繁的操作excel,里边涉及到很多和图表有关的东西.有时候需要使用java操作excel自带的图标,比较复杂的我们都是使用excel模板的形式实现. 除此之外,也有一些功能只需要生成对应的 ...