您的位置:首页 > 其它

CodeForces 121E -- Lucky Array (树状数组)

2015-04-07 19:51 423 查看
题目大意: 幸运数组,只由4和7组成,题目说数字不会超过10000,只要把这以内的幸运数字都标记出来就可以了;

两种操作: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);
}
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: