您的位置:首页 > 其它

P1972 [SDOI2009]HH的项链

2017-06-26 18:06 459 查看

题目背景



题目描述

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

输入输出格式

输入格式:

第一行:一个整数N,表示项链的长度。

第二行:N 个整数,表示依次表示项链中贝壳的编号(编号为0 到1000000 之间的整数)。

第三行:一个整数M,表示HH 询问的个数。

接下来M 行:每行两个整数,L 和R(1 ≤ L ≤ R ≤ N),表示询问的区间。

输出格式:

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

输入输出样例

输入样例#1:

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


输出样例#1:

2
2
4


说明

数据范围:

对于100%的数据,N <= 50000,M <= 200000。

裸地莫队调了一个小时发现数组开小了。。

啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAXN=2000001;
void read(int & n)
{
char c='+';int x=0;bool flag=0;
while(c<'0'||c>'9')
{c=getchar();if(c=='-')flag=1;}
while(c>='0'&&c<='9')
{x=x*10+(c-48),c=getchar();}
flag==1?n=-x:n=x;
}
int n,m,kuai,x,y,ans=0;
int a[MAXN],pos[MAXN],out[MAXN],happen[MAXN];
struct node
{
int x,y,id;
}q[MAXN];
int comp(const node & a,const node & b)
{
if(pos[a.x]==pos[b.x])
return a.y<b.y;
else return pos[a.x]<pos[b.x];
}
void add(int p)
{
happen[a[p]]++;
if(happen[a[p]]==1)
ans++;
}
void dele(int p)
{
happen[a[p]]--;
if(happen[a[p]]==0)
ans--;
}
void modui()
{
int l=2,r=1;
for(int i=1;i<=m;i++)
{
for(;l<q[i].x;++l)
dele(l);
for(;l>q[i].x;--l)
add(l-1);
for(;r<q[i].y;++r)
add(r+1);
for(;r>q[i].y;--r)
dele(r);
out[q[i].id]=ans;
}
for(int i=1;i<=m;i++)
{
printf("%d\n",out[i]);
}
}
int main()
{
//freopen("diff.in","r",stdin);
//freopen("diff.out","w",stdout);
read(n);
for(int i=1;i<=n;i++)
read(a[i]);
kuai=sqrt(n);
for(int i=1;i<=n;i++)
pos[i]=(i-1)/kuai+1;
read(m);
for(int i=1;i<=m;i++)
{read(q[i].x);read(q[i].y);q[i].id=i;}
sort(q+1,q+m+1,comp);
modui();
return 0;}
/*int comp(const Q & a ,const Q & b)
{
if(pos[a.l]==pos[b.l])
return a.r<b.r;
else return pos[a.l]<pos[b.l];
}*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: