CodeForces 121E -- Lucky Array (树状数组)
2015-04-07 19:51
423 查看
题目大意: 幸运数组,只由4和7组成,题目说数字不会超过10000,只要把这以内的幸运数字都标记出来就可以了;
两种操作:add lrd 从l到r每一项增加数值d;
count lr 输出从l到r的幸运数字的个数;
代码实现:
两种操作: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); } } } } }
相关文章推荐
- CF 121E - Lucky Array(树状数组裸题)
- Codeforces 830B - Cards Sorting 树状数组
- CodeForces 652D Nested Segments(树状数组 离散化)
- Codeforces 557C Arthur and Table 【树状数组 + 二分】
- Codeforces 383C Propagating tree(树状数组)
- CodeForces 589G Hiring(树状数组)
- codeforces 869E(哈希&二维树状数组)
- 树状数组模拟3个元素的排序 Codeforces 12D Ball
- codeforces 374D 树状数组或者线段树
- codeforces 261D Maxim and Increasing Subsequence(树状数组优化最长上升子列)
- Codeforces 900C - Remove Extra One 【树状数组】
- codeforces-121E Lucky Array(树状数组)
- Codeforces 217E Alien DNA (树状数组求第k大)
- CodeForces 121E Lucky Array (树状数组)
- CodeForces 602E【概率DP】【树状数组优化】
- CodeForces - 396C On Changing Tree(树状数组)
- codeforces 628E Zbazi in Zeydabad(线段树||树状数组优化)
- CodeForces 459D Pashmak and Parmida's problem 树状数组 + 离散化
- CodeForces 733C Epidemic in Monstropolis 暴搜+树状数组做法
- codeforces 301D Yaroslav and Divisors(树状数组)