记录编号 192160 评测结果 AAAAAAAAAA
题目名称 [SDOI 2009] HH的项链 最终得分 100
用户昵称 Gravatar一個人的雨 是否通过 通过
代码语言 C++ 运行时间 0.971 s
提交时间 2015-10-09 21:13:30 内存使用 27.02 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
const int maxn=1000000+10;
int Ans[maxn];
struct A{
	int l,r,id;
	int block;
	bool operator < (const A &a) const{
		if (block==a.block) return r<a.r;
		return block<a.block;
	}
	void read(int i){
		scanf("%d%d",&l,&r);
		id=i;
	}
}ask[maxn];
int cnt[maxn],a[maxn],n,m,blo;

int main(){
	freopen("diff.in","r",stdin);
	freopen("diff.out","w",stdout);
	scanf("%d",&n); blo=sqrt(n);
	for (int i=1;i<=n;++i) scanf("%d",&a[i]);
	scanf("%d",&m);
	for (int i=1;i<=m;++i){
		ask[i].read(i);
		ask[i].block=(ask[i].l-1)/blo+1;
	}
	sort(ask+1,ask+m+1);
	cnt[a[1]]++;
	for (int i=1,l=1,r=1,ans=1;i<=m;++i){
		while (r>ask[i].r){
			cnt[a[r]]--;
			if (!cnt[a[r]]) ans--;
			r--;
		}
		while (r<ask[i].r){
			r++;
			cnt[a[r]]++;
			if (cnt[a[r]]==1) ans++;
		}
		while (l>ask[i].l){
			l--;
			cnt[a[l]]++;
			if (cnt[a[l]]==1) ans++;
		}
		while (l<ask[i].l){
			cnt[a[l]]--;
			if (cnt[a[l]]==0) ans--;
			l++;
		}
		Ans[ask[i].id]=ans;
	}
	for (int i=1;i<=m;++i) printf("%d\n",Ans[i]);
	return 0;
}