记录编号 |
449537 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[SDOI 2009] HH的项链 |
最终得分 |
100 |
用户昵称 |
Hzoi_Mafia |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
2.647 s |
提交时间 |
2017-09-14 16:40:50 |
内存使用 |
11.24 MiB |
显示代码纯文本
- #include<algorithm>
- #include<iostream>
- #include<cstring>
- #include<cstdio>
- #include<cmath>
- using namespace std;
- inline int read(){
- int sum(0);
- char ch(getchar());
- for(;ch<'0'||ch>'9';ch=getchar());
- for(;ch>='0'&&ch<='9';sum=sum*10+(ch^48),ch=getchar());
- return sum;
- }
- int n,m,blo;
- int w[50005],cnt[1000005],bl[1000005];
- int bloans[5005],l[5005],r[5005];
- int ans[200005];
- struct que{
- int l,r,id;
- }q[200005];
- bool operator<(que a,que b){
- if(bl[a.l]!=bl[b.l])
- return a.l<b.l;
- return a.r<b.r;
- }
- int mx;
- inline void del(int x){
- --cnt[x];
- if(cnt[x]==0)
- --bloans[bl[x]];
- }
- inline void add(int x){
- ++cnt[x];
- if(cnt[x]==1)
- ++bloans[bl[x]];
- }
- int tot;
- inline int query(){
- int ret(0);
- for(int i=1;i<=tot;++i)
- ret+=bloans[i];
- return ret;
- }
- inline int gg(){
- freopen("diff.in","r",stdin);
- freopen("diff.out","w",stdout);
- n=read();
- for(int i=1;i<=n;++i)
- w[i]=read(),mx=max(mx,w[i]);
- blo=sqrt(mx>>1);
- for(int i=1;i<=mx;++i){
- bl[i]=(i-1)/blo+1;
- r[bl[i]]=i;
- tot=bl[i];
- if(!l[bl[i]])
- l[bl[i]]=i;
- }
- m=read();
- for(int i=1;i<=m;++i)
- q[i].l=read(),q[i].r=read(),q[i].id=i;
- sort(q+1,q+m+1);
- int l(1),r(0);
- for(int i=1;i<=m;++i){
- while(l<q[i].l){
- del(w[l]);
- ++l;
- }
- while(r>q[i].r){
- del(w[r]);
- --r;
- }
- while(l>q[i].l){
- --l;
- add(w[l]);
- }
- while(r<q[i].r){
- ++r;
- add(w[r]);
- }
- ans[q[i].id]=query();
- }
- for(int i=1;i<=m;++i)
- printf("%d\n",ans[i]);
- return 0;
- }
- int K(gg());
- int main(){;}