Codevs 2307[SDOI2009]HH的项链
同题:
Codevs 2307 HH的项链
BZOJ 1878 HH的项链
洛谷 1972 HH的项链
2009年省队选拔赛山东
HH有一串由各种漂亮的贝壳组成的项链。HH相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义。HH不断地收集新的贝壳,因此,他的项链变得越来越长。有一天,他突然提出了一个问题:某一段贝壳中,包含了多少种不同的贝壳?这个问题很难回答……因为项链实在是太长了。于是,他只好求助睿智的你,来解决这个问题。
第一行:一个整数N,表示项链的长度。
第二行:N个整数,表示依次表示项链中贝壳的编号(编号为0到1000000之间的整数)。
第三行:一个整数M,表示HH询问的个数。
接下来M行:每行两个整数,L和R(1 ≤ L ≤ R ≤ N),表示询问的区间。
M行,每行一个整数,依次表示询问对应的答案。
6
1 2 3 4 3 5
3
1 2
3 5
2 6
2
2
4
对于20%的数据,N ≤ 100,M ≤ 1000;
对于40%的数据,N ≤ 3000,M ≤ 200000;
对于100%的数据,N ≤ 50000,M ≤ 200000。
题解:
这题首先在线是没法做的,所以我们可以考虑离线算法
首先记录下每种颜色的下一种颜色所在的位置
将所有询问按照左端点进行排序
将所有颜色的第一个点x a[x]++
然后从左往右扫
扫到一个点x将a[next[x]]++
碰到一个询问l,r输出sum[r]-sum[l-1]
其中sum是a数组的前缀和
求前缀和可以用树状数组
AC代码:


#include<bits/stdc++.h>
using namespace std;
#define N 50010
int n,m,maxn,a[N],next[N],c[N],p[N*];
struct node{
int l,r,id,ans;
}q[N<<];
inline int read(){
register int x=,f=;
register char ch=getchar();
while(ch>''||ch<''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
inline bool cmp1(const node &a,const node &b){
return a.l==b.l?a.r<b.r:a.l<b.l;
}
inline bool cmp2(const node &a,const node &b){
return a.id<b.id;
}
inline int lowbit(int x){
return x&-x;
}
inline void updata(int p){
for(int i=p;i<=n;i+=lowbit(i)) c[i]+=;
}
inline int query(int p){
int ans=;
for(int i=p;i>=;i-=lowbit(i)) ans+=c[i];
return ans;
}
int main(){
n=read();
for(int i=;i<=n;i++) a[i]=read(),maxn=max(maxn,a[i]);
for(int i=n;i;i--) next[i]=p[a[i]],p[a[i]]=i;
for(int i=;i<=maxn;i++) if(p[i]) updata(p[i]);
m=read();
for(int i=;i<=m;i++) q[i].l=read(),q[i].r=read(),q[i].id=i;
stable_sort(q+,q+m+,cmp1);
int l=;
for(int i=;i<=m;i++){
for(;l<q[i].l;l++) if(next[l]) updata(next[l]);
q[i].ans=query(q[i].r)-query(q[i].l-);
}
stable_sort(q+,q+m+,cmp2);
for(int i=;i<=m;i++) printf("%d\n",q[i].ans);
return ;
}
看完前面还不会,就用莫队水过吧。
莫队不会的戳这里
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
const int M=1e6+,N=5e5+;
struct node{
int l,r,t,pos;
bool operator < (const node &a)const{
return pos==a.pos?r<a.r:pos<a.pos;
}
}b[N];
int n,m,l,r,sum,a[N],f[M],ans[N];
void add(int x){
if(f[x]==) sum++;
f[x]++;
}
void del(int x){
if(f[x]==) sum--;
f[x]--;
}
int main(){
freopen("diff.in","r",stdin);
freopen("diff.out","w",stdout);
n=read();
for(int i=;i<=n;i++) a[i]=read();
int k=sqrt(n*1.0)+0.5;
m=read();
for(int i=;i<=m;i++){
b[i].l=read();b[i].r=read();
b[i].t=i;b[i].pos=b[i].l/k;
}
sort(b+,b+m+);
memset(f,,sizeof f);
l=;r=;sum=;
for(int i=;i<=m;i++){
while(r>b[i].r){
del(a[r]);
r--;
}
while(r<b[i].r){
r++;
add(a[r]);
}
while(l>b[i].l){
l--;
add(a[l]);
}
while(l<b[i].l){
del(a[l]);
l++;
}
ans[b[i].t]=sum;
}
for(int i=;i<=m;i++) printf("%d\n",ans[i]);
return ;
}
Codevs 2307[SDOI2009]HH的项链的更多相关文章
- BZOJ 1878: [SDOI2009]HH的项链
1878: [SDOI2009]HH的项链 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 3548 Solved: 1757[Submit][Statu ...
- 【BZOJ1878】[SDOI2009]HH的项链 离线BIT
1878: [SDOI2009]HH的项链 Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一段贝壳,思考它们所表达的含义 ...
- BZOJ 1878: [SDOI2009]HH的项链 离线树状数组
1878: [SDOI2009]HH的项链 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
- Bzoj 1878: [SDOI2009]HH的项链 莫队
1878: [SDOI2009]HH的项链 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 2717 Solved: 1363[Submit][Statu ...
- BZOJ 1878: [SDOI2009]HH的项链( BIT )
离线处理 , 记下询问的左右端点并排序 , 然后可以利用树状数组 , 保证查询区间时每种颜色只计算一次 ------------------------------------------------ ...
- 洛谷 P1972 [SDOI2009]HH的项链【莫队算法学习】
P1972 [SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含 ...
- BZOJ_1878_[SDOI2009]HH的项链_莫队
BZOJ_1878_[SDOI2009]HH的项链_莫队 Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一 段贝壳,思考 ...
- bzoj千题计划181:bzoj1878: [SDOI2009]HH的项链
http://www.lydsy.com/JudgeOnline/problem.php?id=1878 之前用莫队做的,现在用树状数组 把每种数的第一个出现位置在树状数组中+1 nxt[i] 记录i ...
- 洛谷P1972 [SDOI2009]HH的项链 题解
[SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不 ...
随机推荐
- Codeforces 602B Approximating a Constant Range(想法题)
B. Approximating a Constant Range When Xellos was doing a practice course in university, he once had ...
- C#中的ref和out的区别
转载原地址 http://www.cnblogs.com/gjahead/archive/2008/02/28/1084871.html ref和out的区别在C# 中,既可以通过值也可以通过引用传递 ...
- java实现抓取某公司官网新闻
这里先说一下,实习期的一个项目,当时并没有该合作公司的获取新闻的接口,但是项目又急着上线,所以总监就让我来做一个简单的抓取,现将主要的工具类NewsUtil.java贴出来供大家参考. NewsUti ...
- Spring Batch Concepts Chapter
Spring Batch Concepts Chapter The below figure shows two kinds of Spring Batch components:infrastruc ...
- LINQ to XML 从逗号分隔值 (CSV) 文件生成 XML 文件
参考:http://msdn.microsoft.com/zh-cn/library/bb387090.aspx 本示例演示如何使用 语言集成查询 (LINQ) 和 LINQ to XML 从逗号分隔 ...
- URAL 1777 D - Anindilyakwa 暴力
D - AnindilyakwaTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/v ...
- NDK环境配置
1.下载安装插件:com.android.ide.eclipse.ndk_23.0.2.1259578.jar copy到E:\eclipse\adt-bundle-windows-x86- ...
- 自己动手写CPU之第九阶段(8)——MIPS32中的LL、SC指令说明
将陆续上传新书<自己动手写CPU>,今天是第47篇. 9.7 ll.sc指令实现思路 9.7.1 实现思路 这2条指令都涉及到訪问链接状态位LLbit,能够将LLbit当做寄存器处理,ll ...
- 在 Fedora 里安装自带的 MATE和 cinnamon
参见 http://wiki.mate-desktop.org/download#fedora安装方法: yum groupinstall mate-desktop yum groupinstall ...
- javascript操作
1. >> 按位右移运算符 result = expression1 >> expression2 右移表达式的位,保持符号不变. >> 运算符将 expressi ...