HDU 4267 A Simple Problem with Integers【树状数组】
题意: 知道了连续的 n 个数的 值,有两种操作:
1 a b k c: adding c to each of Ai which satisfies a <= i <= b and (i - a) % k == 0
2 a : means querying the value of a
分析:因为k比价小,可以多个树状数组,根据 i%k的不同建立k 个树状数组,每次修改操作对其中 1 棵树状数组进行操作
每次查询对其中10个树状数组统计结果累加。
#include<stdio.h> #include<string.h> #define clr(x)memset(x,0,sizeof(x)) int t[12][12][50005]; int n; int lowbit(int x) { return (x)&(-x); } void add(int i,int j,int pos,int w) { while(pos<=n) { t[i][j][pos]+=w; pos+=lowbit(pos); } } int getsum(int i,int j,int pos) { int s=0; while(pos>0) { s+=t[i][j][pos]; pos-=lowbit(pos); } return s; } int v[50005]; int main() { int m,i; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;i++) scanf("%d",&v[i]); clr(t); int a,b,k,q; scanf("%d",&m); int op; while(m--) { scanf("%d",&op); if(op==1) { scanf("%d%d%d%d",&a,&b,&k,&q); a--; b--; int nu=(b-a)/k; int s=a%k; add(k,s,a/k+1,q); add(k,s,a/k+nu+2,-q); } else { scanf("%d",&a); a--; int tt=v[a]; for(i=1;i<=10;i++) tt+=getsum(i,a%i,a/i+1); printf("%d\n",tt); } } } return 0; }