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; }
相关文章推荐
- HDU - 4267 A Simple Problem with Integers(树状数组的逆操作)
- HDU 4267 A Simple Problem with Integers [树状数组]
- A Simple Problem with Integers 多树状数组分割,区间修改,单点求职。 hdu 4267
- HDU 4267 - A Simple Problem with Integers 树状数组区间修改
- HDU - 4267 A Simple Problem with Integers(树状数组)
- HDU 4267 A Simple Problem with Integers 多个树状数组
- HDU-4267-A Simple Problem with Integers-(树状数组)
- HDU 4267 A Simple Problem with Integers【树状数组】
- 【三维树状数组与离散化】HDU 4267——A Simple Problem with Integers
- HDU 4267 A Simple Problem with Integers (树状数组)
- HDU 4267 A Simple Problem with Integers(树状数组)
- hdu 4267 A Simple Problem with Integers(分类别维护多个树状数组)
- HDOJ 4267 A Simple Problem with Integers 树状数组
- A Simple Problem with Integers+hdu+树状数组
- POJ 3468 A Simple Problem with Integers(树状数组区间更新)
- poj 3468 A Simple Problem with Integers (线段树区间更新 + 树状数组区间更新)
- HDU 4267 A Simple Problem with Integers 数列离散化 + 树状数组
- hdu 4267 A Simple Problem with Integers 树状数组
- HDU 4267 A Simple Problem with Integers(12年长春网络赛-A题-线段树)
- HDU 4267 A Simple Problem with Integers(线段树)#by zh