您的位置:首页 > 其它

HDU 4267 A Simple Problem with Integers【树状数组】

2012-09-10 21:26 369 查看
题意: 知道了连续的 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: