题目大意: 幸运数组,只由4和7组成,题目说数字不会超过10000,只要把这以内的幸运数字都标记出来就可以了;
两种操作:add lrd 从l到r每一项增加数值d;
两种操作:add lrd 从l到r每一项增加数值d;
count lr 输出从l到r的幸运数字的个数;
代码实现:
#include<stdio.h>
#include<string.h>
const int maxn=100010;
int a[maxn],flag[maxn],sum[maxn],n,m;
int Lowbit(int x){
return x&(-x);
}
void Add(int i,int val){
while(i<=n){
sum[i]+=val;
i+=Lowbit(i);
}
}
int Sum(int i){
int s=0;
while(i>0){
s+=sum[i];
i-=Lowbit(i);
}
return s;
}
int main(){
flag[4]=flag[7]=flag[44]=flag[47]=flag[74]=flag[77]=1;
flag[444]=flag[447]=flag[474]=flag[744]=flag[477]=flag[747]=flag[774]=flag[777]=1;
flag[4444]=flag[4447]=flag[4474]=flag[4744]=flag[7444]=flag[4477]=flag[4747]=flag[7447]=flag[4774]=flag[7474]=flag[7744]=1;
flag[4777]=flag[7477]=flag[7747]=flag[7774]=flag[7777]=1;
while(~scanf("%d%d",&n,&m)){
memset(sum,0,sizeof(sum));
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
if(flag[a[i]]) Add(i,1);
}
char p[10];
int l,r,d;
while(m--){
scanf("%s%d%d",p,&l,&r);
if(p[0]=='c') printf("%d\n",Sum(r)-Sum(l-1));
else{
scanf("%d",&d);
if(d==0) continue;
for(int i=l;i<=r;i++){
if(flag[a[i]]) Add(i,-1);
a[i]+=d;
if(flag[a[i]]) Add(i,1);
}
}
}
}
}