记录编号 |
483311 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[HEOI 2012]采花 |
最终得分 |
100 |
用户昵称 |
Shirry |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
20.477 s |
提交时间 |
2018-01-16 10:51:31 |
内存使用 |
30.92 MiB |
显示代码纯文本
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1000010;
struct poi{int l,r,id;}q[maxn];
int n,c,m,ans,a[maxn],vis[maxn],Ans[maxn],Block;
bool cmp(poi x,poi y){
if(x.l/Block!=y.l/Block)return x.l<y.l;
else return x.r<y.r;
}
int main(){
freopen("1flower.in","r",stdin);
freopen("1flower.out","w",stdout);
scanf("%d%d%d",&n,&c,&m);Block=sqrt(double(n));
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
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;
for(int i=1;i<=m;i++){
while(L<q[i].l){
vis[a[L]]--;
if(vis[a[L]]==1)ans--;
L++;
}
while(L>q[i].l){
L--,vis[a[L]]++;
if(vis[a[L]]==2)ans++;
}
while(R<q[i].r){
R++,vis[a[R]]++;
if(vis[a[R]]==2)ans++;
}
while(R>q[i].r){
vis[a[R]]--;
if(vis[a[R]]==1)ans--;
R--;
}
Ans[q[i].id]=ans;
}
for(int i=1;i<=m;i++)printf("%d ",Ans[i]);
return 0;
}