记录编号 306403 评测结果 AAAAAAAAAA
题目名称 [SDOI 2009] HH的项链 最终得分 100
用户昵称 GravatarTenderRun 是否通过 通过
代码语言 C++ 运行时间 3.072 s
提交时间 2016-09-11 22:31:34 内存使用 10.07 MiB
显示代码纯文本
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
const int N=50010,M=200010,K=1000010;
int num[K],hsh[K],a[N],n,Q,block,cnt;
int ql[M],qr[M],p[M],ans[M],tmp,tim;
bool cmp(int x,int y){
	return (ql[x]-1)/block!=(ql[y]-1)/block?ql[x]<ql[y]:qr[x]<qr[y];
}
void Add(int x){
	if(!num[x])tmp++;
	num[x]++;
}
void Min(int x){
	if(num[x]==1)tmp--;
	num[x]--;
}
int main(){
	freopen("diff.in","r",stdin);
	freopen("diff.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(NULL);cout.tie(NULL);
	cin>>n;
	for(int i=1,x;i<=n;i++){
		cin>>x;
		if(!hsh[x])hsh[x]=++cnt;
		a[i]=hsh[x];
	}
	cin>>Q;
	for(int i=1;i<=Q;i++)	
		cin>>ql[i]>>qr[i],p[i]=i;
	block=(int)sqrt(n+0.5);
	sort(p+1,p+Q+1,cmp);
	int l=1,r=0;
	for(int i=1;i<=Q;i++){
		while(ql[p[i]]<l)Add(a[--l]);
		while(ql[p[i]]>l)Min(a[l++]);
		while(qr[p[i]]>r)Add(a[++r]);
		while(qr[p[i]]<r)Min(a[r--]);			
		ans[p[i]]=tmp;
	}
	for(int i=1;i<=Q;i++)
		cout<<ans[i]<<"\n";	
	return 0;
}