题面

解析

这题本来莫队可以过的。

然而,对于某些加强的数据,莫队就得吸氧了。。

所以,本题解还将介绍另一种算法——树状数组。

首先,莫队就不用讲了吧(毕竟只是板子)。

那么,开始进入正题(似乎有点啰嗦)。

我们先将每个询问存下来(还是离线处理),

然后再以右端点为关键字从小到大排序。

然后,对于1~n中的每个点r,

记录下区间1~r中每种颜色最右边的位置,

即在树状数组中将每种颜色最右边的位置设为1。

显然,如果询问q的右端点正好为r的话,

那么对于q的左端点l,

这种记录方式是最优的。

因为如果不是记录的最右边的点的话,就有可能忽略。

所以,先把询问按右端点排序,

再O(n)扫一遍,

并用树状数组计算前缀和,统计答案就行了

具体看代码吧:

#include<bits/stdc++.h>
#define lowbit(a) (a&(-a))
using namespace std; inline int read(){
int sum=,f=;char ch=getchar();
while(ch>'' || ch<''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){sum=sum*+ch-'';ch=getchar();}
return f*sum;
} const int MAXN=;
struct node{
int l,r,id;
}q[MAXN];
int n,m;
int ans[MAXN],t[MAXN],a[MAXN];
int pla[MAXN*]; bool cmp(node a,node b){
return a.r<b.r;
} inline void add(int x,int k){
for(int i=x;i<=n;i+=lowbit(i)){
t[i]+=k;
}
} inline int ask(int x){
int ret=;
for(int i=x;i;i-=lowbit(i)){
ret+=t[i];
}
return ret;
} int main(){
n=read();
for(int i=;i<=n;i++) a[i]=read();
m=read();
for(int i=;i<=m;i++) q[i].l=read(),q[i].r=read();
for(int i=;i<=m;i++) q[i].id=i;
sort(q+,q+m+,cmp);
int p=;
for(int i=;i<=n;i++){
if(pla[a[i]]){
add(pla[a[i]],-);
}
add(i,);pla[a[i]]=i;
while(q[p].r==i){
ans[q[p].id]=ask(i)-ask(q[p].l-);
p++;
}
}
for(int i=;i<=m;i++) printf("%d\n",ans[i]);
return ;
}

题解 【SDOI2009】HH的项链的更多相关文章

  1. [洛谷P1972][题解][SDOI2009]HH的项链

    别碰我! 自己还是太蒟了…… 看了好久,最后抄参考题解打出来的…… 前面的可能影响后面的,所以按照询问右端点排序 这时候维护一个前缀和数组就可以了, 那么问题又来了,去重? 可以这样,从前往后枚举,如 ...

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

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

  3. 洛谷P1972 [SDOI2009]HH的项链 题解

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

  4. 【BZOJ1878】[SDOI2009]HH的项链 离线BIT

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

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

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

  6. Bzoj 1878: [SDOI2009]HH的项链 莫队

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

  7. BZOJ1878: [SDOI2009]HH的项链 (离线查询+树状数组)

    1878: [SDOI2009]HH的项链 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1878 Description: HH有一串由 ...

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

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

  9. BZOJ 1878: [SDOI2009]HH的项链

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

  10. BZOJ 1878: [SDOI2009]HH的项链( BIT )

    离线处理 , 记下询问的左右端点并排序 , 然后可以利用树状数组 , 保证查询区间时每种颜色只计算一次 ------------------------------------------------ ...

随机推荐

  1. go 拼接sql

    //原文链接:https://www.jianshu.com/p/a0569157c418 golang mysql拼接子查询 使用fmt.Sprintf拼接SQL 实例代码 func Select( ...

  2. 链表分割——牛客剑指offer

    题目描述: 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前 给定一个链表的头指针 ListNode pHead,请返回重新排列后的链表的头指针.注意:分割以后 ...

  3. Java 反射理解(二)-- 动态加载类

    Java 反射理解(二)-- 动态加载类 概念 在获得类类型中,有一种方法是 Class.forName("类的全称"),有以下要点: 不仅表示了类的类类型,还代表了动态加载类 编 ...

  4. 深入理解计算机系统 第十二章 并发编程 part1 第二遍

    三种构造并发程序的方法及其优缺点 1.进程 用这种方法,每个逻辑控制流都是一个进程,由内核来调度和维护.因为进程有独立的虚拟地址空间,想要和其他流通信,控制流必须使用某种显式的进程间通信机制. 优点: ...

  5. C# HttpWebRequest请求远程地址获取返回消息

    HttpWebRequest请求远程地址获取返回消息 /// <summary> /// 请求远程Api获取响应返回字符串 /// </summary> /// <par ...

  6. Unity鼠标移动到物体上显示信息

    相信大家玩游戏的时候,鼠标移动到游戏装备上,都会显示装备的的具体信息,那么接下来就写代码把,废话不多说. 下面是 效果图 鼠标移动到装备位置显示的信息,鼠标移动不在装备区域后不现实信息,下面是代码 : ...

  7. fork 代码进阶

    fork进阶知识 先看一份代码: [cpp] view plain copy /* *  fork_test.c *  version 2 *  Created on: 2010-5-29 *     ...

  8. xpath下载

    1.下载地址,版本号为 2.0.2: 链接: https://pan.baidu.com/s/1GXPm1kMENXhOkefKcEQnlA 密码: 8wwv 2.安装 1).在chrome右上角找到 ...

  9. 爬虫时安装的newspaper 新闻包

    Newspaper3k: Article scraping & curation 首先在命令行安装 newspaper pip install Newspaper3k 然后导入包进行写代码 f ...

  10. Redis之过期策略

    一.设置过期时间 Redis对存储值的过期处理实际上是针对该值的键(key)处理的,即时间的设置也是设置key的有效时间.Expires字典保存了所有键的过期时间,Expires也被称为过期字段. e ...