记录编号 280152 评测结果 AAAAAAAAAA
题目名称 [SDOI 2009] HH的项链 最终得分 100
用户昵称 Gravatarliu_runda 是否通过 通过
代码语言 C++ 运行时间 1.407 s
提交时间 2016-07-10 07:14:50 内存使用 5.88 MiB
显示代码纯文本
#include<cstdio>
#include<cctype>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std; 
int read(){
    int x;char ch;
    while(ch=getchar(),!isdigit(ch));
    x=ch-'0';
    while(ch=getchar(),isdigit(ch))x=x*10+ch-'0';
    return x;
}
const int maxn=50005,maxm=200005,maxc=1000005;
int S;
int a[maxn];
struct query{
    int l,r,num,ans;
}Q[maxm];
bool cmp(const query &a,const query &b){//this is a smart compare function 
    return ((a.l-1)/S==(b.l-1)/S)?a.r<b.r:a.l<b.l;
}
bool cmp2(const query &a,const query &b){
    return a.num<b.num;
}
int cnt[maxc];
int main(){
	freopen("diff.in","r",stdin);
	freopen("diff.out","w",stdout);
    int n=read();
    for(int i=1;i<=n;++i)a[i]=read();
    int m=read();
    for(int i=1;i<=m;++i){
        Q[i].l=read();Q[i].r=read();
        Q[i].num=i;
    }
    S=sqrt(n+0.5);
    sort(Q+1,Q+m+1,cmp);
    for(int j=Q[1].l;j<=Q[1].r;++j){
    	if(!cnt[a[j]])Q[1].ans++;
    	cnt[a[j]]++;
    }
	for(int i=2;i<=m;++i){
        Q[i].ans=Q[i-1].ans;
        if(Q[i-1].r<Q[i].r){
			for(int j=Q[i-1].r+1;j<=Q[i].r;++j){
            	if(!cnt[a[j]])Q[i].ans++;
           	 	cnt[a[j]]++;
        	}
		}
		else if(Q[i-1].r>Q[i].r)
		{	for(int j=Q[i-1].r;j>Q[i].r;--j){
				cnt[a[j]]--;
				if(!cnt[a[j]])Q[i].ans--;
			}
		}
        if(Q[i].l<Q[i-1].l){
            for(int j=Q[i].l;j<Q[i-1].l;++j){
                if(!cnt[a[j]])Q[i].ans++;
                cnt[a[j]]++;
            }
        }else if(Q[i].l>Q[i-1].l){
            for(int j=Q[i-1].l;j<Q[i].l;++j){
                cnt[a[j]]--;
                if(!cnt[a[j]])Q[i].ans--;
            }
        }
    }
    sort(Q+1,Q+m+1,cmp2);
    for(int i=1;i<=m;++i)printf("%d\n",Q[i].ans);
    fclose(stdin);fclose(stdout);
    return 0;
}/*
10
1 3 2 4 3 5 4 6 5 7
8
1 5
6 10
1 9
3 7
2 5
1 2
3 5
7 7
4
4
6
4
3
2
3
4
*/