您的位置:首页 > 其它

HDU 4267 A Simple Problem with Integers(树状数组)

2013-05-31 16:05 459 查看
3维树状数组,将单点更新转变为区间更新。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define LL __int64
#define N 50002
int p[11][11][50011];
int num[50011];
int n;
int lowbit(int t)
{
return t&(-t);
}
void insert(int k,int a,int t,int d)
{
while(t < N)
{
p[k][a][t] += d;
t += lowbit(t);
}
}
LL getsum(int k,int a,int t)
{
LL ans = 0;
while(t > 0)
{
ans += p[k][a][t];
t -= lowbit(t);
}
return ans;
}
int main()
{
int i,j,temp,m,a,b,k,c;
LL ans = 0;
while(scanf("%d",&n)!=EOF)
{
memset(p,0,sizeof(p));
for(i = 1;i <= n;i ++)
scanf("%d",&num[i]);
scanf("%d",&m);
for(i = 1;i <= m;i ++)
{
scanf("%d",&temp);
if(temp == 1)
{
scanf("%d%d%d%d",&a,&b,&k,&c);
insert(k,a%k,a/k+1,c);//+1为了防止出现0
insert(k,a%k,a/k+(b-a)/k+2,-c);//区间更新将[a/k+1,a/k+(b-a)/k+1]都增加c
}
else
{
scanf("%d",&a);
ans = 0;
for(j = 1;j <= 10;j ++)
{
ans += getsum(j,a%j,a/j+1);
}
printf("%I64d\n",ans+num[a]);
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: