洛谷P1972 HH的项链
分析:
题目描述不说了,大意是,求一段区间内不同元素的种数。
看到区间,我们大概先想到的是暴力(然后炸掉)、线段树、树状数组、分块。
下面给出的是一种树状数组的想法。
首先,对于每一段区间里的数,如果出现重复的元素,我们只需要看最后一个就好了。所以,我们可以对所有需要查询区间的右端点进行从小到大的排序,从左往右枚举右端点维护一个从左向右的树状数组,表示一段区间的种类数。
听不懂的话我们举个栗子例子。
我们假设现在有一个序列:
now为现在的右端点;
insert(i , j)表示在第i 个位置出现了j个位重复的数,就需要我们在我们维护的树状数组序列中+j。
1 ,2 ,1 ,3
当now = 1时,insert(1 , 1),树状数组对应的序列就变成了1,0,0,0
当now = 2,insert(2,1),序列变成了1,1,0,0
当now = 3时,我们发现a[3]=1,而1之前已经出现过了,所以最后一次出现的地方(a[1])减1,即insert(1,−1),a[3]这个地方加1,即insert(3,1),序列变成了0,1,1,0
当now = 4时,insert(4 , 1),序列变成0,1,1,1
这样的话,我们枚举ii的时候处理一下就OK了.
最后whilewhile输出sum[ ](类似前缀和的一个数组如果查询区间[3~5],就变成sum[5]−sum[2])。
你会发现代码中还有一个last[ ],last[i]根据我的解释应该很好懂吧,表示的就是ii这个元素最后出现的位置。。
好了,代码奉上。。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = ; inline int read(){
char ch = getchar();
int f = ,x = ;
while(ch > '' || ch < ''){if(ch == '-')f = -;ch = getchar();}
while(ch >= '' && ch <= ''){x = (x << ) + (x << ) + ch - '';ch = getchar();}
return x * f;
} int n,a[maxn],m;
struct Edge{
int L,R,val;
}e[maxn << ];
int last[maxn],sum[maxn],ans[maxn];
int tmp; bool cmp(Edge a,Edge b){return a.R < b.R;} int lowbit(int x){return x & (-x);} void insert(int x,int v){
for(int i=x;i<=n;i+=lowbit(i))
sum[i] += v;
} int query(int x){
int s = ;
for(int i=x;i;i-=lowbit(i))
s += sum[i];
return s;
} int main(){
n = read();
for(int i=;i<=n;i++)
a[i] = read();
m = read();
for(int i=;i<=m;i++){
e[i].L = read();
e[i].R = read();
e[i].val = i;
}
sort(e + , e + + m , cmp);
int now = ;
for(int i=;i<=n;i++){
insert(i , );
if(last[a[i]]) insert(last[a[i]] , -);
last[a[i]] = i;
tmp = query(i);
while(e[now].R == i && now <= m){
ans[e[now].val] = tmp - query(e[now].L - );
now++;
}
}
for(int i=;i<=m;i++)
printf("%d\n",ans[i]);
return ;
}
洛谷P1972 HH的项链的更多相关文章
- [洛谷 P1972] HH的项链(SDOI2009)
P1972 [SDOI2009]HH的项链 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断 ...
- 洛谷P1972 HH的项链【树状数组】
题目:https://www.luogu.org/problemnew/show/P1972 题意:给定一个长度为n的序列,数字表示珠子的种类.m次查询每次询问给定区间内珠子的种类数. 思路:可以说是 ...
- 洛谷 P1972 HH的项链 题解
题面 本题其实主要就这几点: 1.离线,以右端点排序(从小到大); 2.建立树状数组c[],c[i]表示从1~i中有多少种不同的数字: 3.对于每次查询的答案就是sum(r)-sum(l-1); 4. ...
- BZOJ1878 洛谷1972 HH的项链题解
洛谷链接 BZOJ链接 看到这样不用修改的题目,应该佷容易就联想到了离线来处理. 我们发现若将询问按照r来排序,排完后每次对答案有贡献的仅是每个颜色最后出现的位置 我们用next[i]表示i处颜色之前 ...
- 洛谷1972 HH的项链 树状数组查询区间内不同的数的数量
题目链接:https://www.luogu.com.cn/problem/P1972 题意大致是:给定一个序列长度为n,给出m个查询区间,要求响应是区间内不同的数的个数.为此我们考虑到树状数组的区间 ...
- 洛谷P1972 [SDOI2009]HH的项链 题解
[SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不 ...
- 洛谷 P1972 [SDOI2009]HH的项链【莫队算法学习】
P1972 [SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含 ...
- 洛谷 P1972 [SDOI2009]HH的项链 解题报告
P1972 [SDOI2009]HH的项链 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断 ...
- 洛谷——P1972 [SDOI2009]HH的项链(线段树)
P1972 [SDOI2009]HH的项链 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的 ...
随机推荐
- 项目管理---git----遇到问题------.gitignore不起作用
情况 在管理一个版本库时,有时候不想要管理某些文件,这个时候我就把这个问价写到.gitignore文件中,这样应该就可以将这个文件忽略,不再进行·版本管理了,但是经常出现的情况是:将这些文件名写到其中 ...
- DataTables实现rowspan思路
直接看例子吧 <table id="example" class="display table table-bordered" cellspacing=& ...
- Redis学习基础三
回顾: 上一基础上浅尝了redis的存储数据类型,这一节将分别介绍数据类型的基础使用 一.启动本地Redis服务 1.打开cmd 窗口 使用 cd 命令切换至redis 安装根目录 运行: redis ...
- thinkphp3 行为(behavior)分析和基本使用
1. 名词解析 官方解析: 来自 http://document.thinkphp.cn/manual_3_2.html#behavior_extend 行为(Behavior)是一个比较抽象的概念, ...
- python的str()字符串类型的方法详解
字符串一旦创建,不可修改,一旦修改或者拼接,都会造成重新生成字符串,因为内存存数据是一个挨着一个存的,如果增加一个字符串的话,之前的老位置只有一个地方,不够,这是原理性的东西,在其他语言里面也一样 7 ...
- P2831 愤怒的小鸟
P2831 愤怒的小鸟 从 \((0, 0)\) 发射一只鸟, 轨迹满足抛物线, 问最少几只鸟可以打完 \(n <= 18\) 只猪 错误日志: 处理抛物线数组没有初始化 Solution 数据 ...
- java反射机制的理解
反射机制是什么概念?大多都有介绍,指的是程序在运行状态中,能够加载一个只有类名的类,加载完之后会在堆上产生一个Class对象.通过这个 Class对象可以获得类的属性.方法和其他类信息.之前对反射的应 ...
- HashMap源码分析-基于JDK1.8
hashMap数据结构 类注释 HashMap的几个重要的字段 hash和tableSizeFor方法 HashMap的数据结构 由上图可知,HashMap的基本数据结构是数组和单向链表或红黑树. 以 ...
- NOIP2016 组合数问题
https://www.luogu.org/problem/show?pid=2822 题目描述 组合数表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以 ...
- 2015/12/12 考了PAT,又回来玩Python了。
上次写飞机大战的坑还没填完,然后就有好长时间没有更新博客了.可能大家在疑惑我在干什么... 其实不是有意暂停博客更新的,十一月学校里有两个考试要准备,然后有好多实验要做.平时的课余时间本来就不是很多了 ...