资讯详情

(CodeForces - 220B)Little Elephant and Array(莫队)

题目链接: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; } 

标签: 二极管db220b

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台