题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4267
题 意:给出一个n数组,进行两项操作:
一:当m=1时,输入a,b,k,c;将所有a到b内满足(i-a)%k==0的项加上c。
二:当m=2时,输入想,输出第x个数。
思 路:定义一个三维树状数组ben[N][12][12],将每一个数所要加的数存入树状数组。
代码如下:
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
typedef int LL;
const int N = 50010;
int vis[N], n;
int ben[N][12][12];
int lowbit( int t )
{
return t & ( -t );
}
void update( int pos, int num, int k, int mod )
{
while( pos <= n )
{
ben[pos][k][mod] += num;
pos += lowbit(pos);
}
}
int getsum( int x, int y )
{
int sum = 0;
while( x > 0 )
{
for( int k = 1; k <= 10; k ++ ){//列举k的值(1,10),将x所对应的项要加的数全部处理
sum += ben[x][k][y%k];
}
x -= lowbit(x);
}
return sum;
}
int main()
{
while( scanf ( "%d", &n ) != EOF )
{
memset( ben, 0, sizeof( ben ) );
for( int i = 1; i <= n; i ++ )
scanf ( "%d", &vis[i] );
LL q;
scanf ( "%d", &q );
for( int i = 0; i < q; i ++ )
{
int m;
scanf ( "%d", &m );
if( m == 1 )
{
LL a, b, k, c;
scanf ( "%d %d %d %d", &a, &b, &k, &c );
update( a, c, k, a%k );
update( b+1, -c, k, a%k );
}
else
{
LL x;
scanf ( "%d", &x );
printf( "%d\n", vis[x]+getsum(x,x) );//原数加上要加的数
}
}
}
return 0;
}