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;
}

 

posted @ 2012-09-10 21:26  'wind  阅读(222)  评论(0编辑  收藏  举报