题目链接:Little Elephant and Array - CodeForces 220B - Virtual Judge (ppsucxtt.cn)
问题是先给我们n个数字,然后给我们m个问题,每个问题包括两个数字l和r,让我们找出区间[ l , r ]x出现x次有多少次内满足?
这显然是莫队要求的。他满足了莫队的主题要求。莫队的主题模板相对固定。我不多说模板。我主要谈谈他的add函数和sub函数以及一些注意事项。
以下是代码:
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue> #include<cmath> using namespace std; const int N=1e5 10; int a[N],cnt[N],ans,sum[N]; struct node{ int id,pl,l,r; }p[N]; bool cmp(node a,node b) { if(a.pl!=b.pl) return a.pl<b.pl; return a.r<b.r; } void add(int x) { if(x>100000) return ;//当x>100000时,x不可能出现x cnt[x] ; if(cnt[x]==x) ans ; if(cnt[x]==x 1) ans--; } void sub(int x) { if(x>100000) return ;//当x>100000时,x不可能出现x cnt[x]--; if(cnt[x]==x) ans ; if(cnt[x]==x-1) ans--; } int main() { int n,m; scanf("%d%d",&n,&m); int pl=sqrt(n); for(int i=1;i<=n;i ) scanf("%d",&a[i]); for(int i=1;i<=m;i ) { scanf("%d%d",&p[i].l,&p[i].r); p[i].id=i; p[i].pl=(p[i].l-1)/pl 1; } sort(p 1,p m 1,cmp); int l=1,r=0; for(int i=1;i<=m;i ) { while(l<p[i].l) { sub(a[l]); l ; } while(l>p[i].l) { l--; add(a[l]); } while(r<p[i].r) { r ; add(a[r]); } while(r>p[i].r) { sub(a[r]); r--; } sum[p[i].id]=ans; } for(int i=1;i<=m;i ) printf("%d\n",sum[i]); return 0; }