记录编号 |
483307 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[SDOI 2009] HH的项链 |
最终得分 |
100 |
用户昵称 |
Shirry |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
1.475 s |
提交时间 |
2018-01-16 09:58:20 |
内存使用 |
7.34 MiB |
显示代码纯文本
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=200010;
const int maxm=50010;
struct poi{int l,r,id;}q[maxn];
int n,m,ans,Block,a[maxm],Ans[maxn],vis[1000010];
bool cmp(poi x,poi y){
if(x.l/Block!=y.l/Block)return x.l<y.l;
else return x.r<y.r;
}
void add(int x){
vis[a[x]]++;
if(vis[a[x]]==1)ans++;
}
void remove(int x){
vis[a[x]]--;
if(!vis[a[x]])ans--;
}
int main(){
freopen("diff.in","r",stdin);
freopen("diff.out","w",stdout);
scanf("%d",&n);Block=sqrt(double(n));
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
scanf("%d",&m);
for(int i=1;i<=m;i++)scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i;
sort(q+1,q+1+m,cmp);
int L=0,R=0;ans=0;
for(int i=1;i<=m;i++){
while(L<q[i].l)remove(L),L++;
while(L>q[i].l)L--,add(L);
while(R<q[i].r)R++,add(R);
while(R>q[i].r)remove(R),R--;
Ans[q[i].id]=ans;
}
for(int i=1;i<=m;i++)printf("%d\n",Ans[i]);
return 0;
}