您的位置:首页 > 其它

hdu 4267 A Simple Problem with Integers

2014-10-02 22:58 435 查看
题目链接:hdu 4267 A Simple Problem with Integers

类似于题目:hdu 1556 Color the ball 的技巧实现树状数组的段更新点查询。

由于该题对于段的更新并不是连续的,从而可以构造多个树状数组。因为$k \in [1,10] $,从而可以把更新划分为如下类型:

1,2,3,4,5...

-------------

1,3,5,7,9...

2,4,6,8,10...

-------------

1,4,7,10,13...

2,5,8,11,14...

3,6,9,12,15...

-------------

...

一共55棵树状数组。对于每一种更新,相应的更新该类型对应的树状数组。

在查询时,同样寻找符合该查询类型的树状数组并最终加上初始值即可完成。

代码如下:

#include <cstdlib>
#include  <cstdio>
#include  <cstring>
#include  <iostream>
#define     MAXN 50005
using namespace std;
int bit[12][12][MAXN];
int arr[MAXN];
int N;
int lowbit(int x)
{
return x&(-x);
}
int query(int a, int b, int l)
{
int sum = 0;
while( l > 0 )
{
sum += bit[a][b][l];
l -= lowbit(l);
}
return sum;
}
void add(int a, int b, int l, int x)
{
while( l <= N )
{
bit[a][b][l] += x;
l += lowbit(l);
}
}
int main(int argc, char *argv[])
{
while(scanf("%d", &N)!= EOF)
{
memset(bit, 0, sizeof(bit));
for( int i = 1 ; i <= N ; i++ )
{
scanf("%d", &arr[i]);
}
int Q;
scanf("%d", &Q);
for( int i = 0 ; i < Q ; i++ )
{
int ty;
scanf("%d", &ty);
if( ty == 1 )
{
int a, b, k, c;
scanf("%d%d%d%d", &a, &b, &k, &c);
add(k, a%k, a, c);
add(k, a%k, b+1, -c);
}
if( ty == 2 )
{
int l;
scanf("%d", &l);
int ans = arr[l];
for( int i = 1 ; i <= 10 ; i++ )
{
ans += query(i, l%i, l);
}
printf ( "%d\n", ans );
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: