题意:有一个序列

"1 a b k c" means adding c to each of Ai which satisfies a <= i <= b and (i - a) % k == 0. (1 <= a <= b <= N, 1 <= k <= 10, -1,000 <= c <= 1,000)
"2 a" means querying the value of Aa. (1 <= a <= N)

分析转自:http://www.cnblogs.com/Griselda/archive/2012/09/15/2686133.html

感觉是树状数组了

但是 树状数组是单点更新 而题目要求是在a b 内每隔 k 个数更新..

如果用for循环对a b 内每隔 k 个位置的数更新就会很费时间..

所以有一个方法就是 按 k 值 i%k 值还有 i/k+1 值把每隔 k 个位置的值都分组..即按 k 值和 i%k 值建树状数组

到时候维护其中一棵 树状数组就好了..

维护的方法是在c[ k ][a%k][(i-a)/k+1] + 1 在c[ k ][a % k ][ (a/k) + (b-a)/k + 2 ] - 1..

关于建成的树状数组..

更新时有55种情况
1,2,3,4,5......
1,3,5,7,9......
2,4,6,8,10....
1,4,7,10,13...
2,5,9,12,15...
3,6,10,13,16...
.
.
.
10,20,30,40,50...

所以用55个树状数组.

建出来的树并不是普通的1,2,3,4,这样的,而是有着间隔的,其实也就是建造了许多树状数组

 1 #include<stdio.h>
 2
 3 #include<queue>
 4 #include<iostream>
 5 #include<algorithm>
 6 #include<string.h>
 7 const int MAXN=50020;
 8
 9
10 int c[12][12][MAXN];
11 int n;
12
13 int lowbit(int x)
14 {
15     return x&(-x);
16 }
17
18 void update(int t1,int t2,int i,int val)
19 {
20     while(i<=n)
21     {
22         c[t1][t2][i]+=val;
23         i+=lowbit(i);
24     }
25
26 }
27 int sum(int t1,int t2,int i)
28 {
29
30     int s=0;
31     while(i>0)
32     {
33         s+=c[t1][t2][i];
34         i-=lowbit(i);
35     }
36     return s;
37 }
38 int num[MAXN];
39 int main()
40 {
41     #ifndef ONLINE_JUDGE
42     freopen("1.in","r",stdin);
43     #endif
44     int m;
45     while(scanf("%d",&n)!=EOF)
46     {
47         for(int i=0;i<n;i++)scanf("%d",&num[i]);
48         for(int i=0;i<12;i++)
49           for(int j=0;j<12;j++)
50             for(int k=0;k<MAXN;k++)
51               c[i][j][k]=0;
52         scanf("%d",&m);
53         int a,b,k,q;
54         int t;
55         while(m--)
56         {
57             scanf("%d",&t);
58             if(t==1)
59             {
60                 scanf("%d%d%d%d",&a,&b,&k,&q);
61                 a--;
62                 b--;
63                 int num=(b-a)/k;
64                 int s=a%k-1;
65                 update(k,s,a/k+1,q);    //s是该数组的开头数字,a/k+1是结尾的数字
66                 update(k,s,a/k+num+2,-q);
67             }
68             else
69             {
70                 scanf("%d",&a);
71                 a--;
72                 int ss=num[a];
73                 for(int i=1;i<=10;i++)
74                 {
75                     ss+=sum(i,a%i-1,a/i+1);
76                 }
77                 printf("%d\n",ss);
78             }
79         }
80     }
81     return 0;
82 }

转载于:https://www.cnblogs.com/cnblogs321114287/p/4343583.html

hdu 4267 多维树状数组相关推荐

  1. hdu 1892二维树状数组

    这题我知道是用树状数组,可是好久没打树状数组了,就想用普通方法水过去~~结果--结果--水了好多方法都水不过,出题人真狠呐--我的水方法是对于每一次查询,初始化ans=(x2-x1+1)*(y2-y1 ...

  2. HDU 5517---Triple(二维树状数组)

    题目链接 Problem Description Given the finite multi-set A of n pairs of integers, an another finite mult ...

  3. HDU 5465 Clarke and puzzle (二维树状数组维护区间异或)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5465 解题思路: 因为要对大量的区间进行异或,所以考虑用二维树状数组就行维护. #include< ...

  4. HDU - 5517 Triple(三维偏序-二维树状数组/CDQ分治)

    题目链接:点击查看 题目大意:给出 n 个二元对 ( a , b ) 和 m 个三元对 ( c , d , e ),对于所有 b == e 的二元对和三元对,可以通过某种运算形成一个新的三元对 ( a ...

  5. hdu 1892【二维树状数组】

    O(∩_∩)O哈哈~二维树状数组被我搞出来了,太开心了,第一道二维树状数组,(- o -)~zZ 虽然中途还是出问题了,就是S询问的时候我没有考虑坐标的大小问题,还是搜了别人的代码才知道的,看来自己考 ...

  6. hdu 5465 Clarke and puzzle (二维树状数组+nim博弈)

    解析: 利用二维树状数组来区间询问异或和,以及单点更新,然后利用nim博弈的结论判断胜负. mymy codecode #include <cstdio> #include <cst ...

  7. HDU-4456 Crowd 二维树状数组+坐标转换

    题意:给定一个N*N的网格,现在M组操作,一种操作时改变网格上的某个单点的权值,另外一种操作是求到一点曼哈顿距离为小于等于k的所有的权值和,初始化网格所有点的权值为0. 解法:这题如果没有那些特定的条 ...

  8. 二维树状数组 ----2021广东省赛 ----- K - Kera‘s line segment[区间转二维平面+树状数组维护前缀最小最大值]

    题目链接 题目大意: 就是一个一维的数轴上面有一堆线段用一个三元组(l,r,val)(l,r,val)(l,r,val)表示. 现在我们有两个操作: 就是往数轴上面添加线段 询问[L,R][L,R][ ...

  9. szu 寒训第二天 树状数组 二维树状数组详解,以及树状数组扩展应用【求逆序对,以及动态第k小数】

    树状数组(Binary Index Tree) 树状数组可以解决可以转化为前缀和问题的问题 这是一类用以解决动态前缀和的问题 (有点像线段树简版) 1.对于 a1 + a2 + a3 + - + an ...

最新文章

  1. mysql 电商项目(一)
  2. 对比 MySQL 的 Binlog 日志处理工具
  3. 加权最小二乘法的原理讲解
  4. 1.3 编程基础之算术表达式与顺序执行 10 计算并联电阻的阻值
  5. [转]设定version 更新js缓存
  6. html怎么根据控IE制台找错误,IE调试网页之三:控制台查看错误和状态
  7. What is the difference between LINQ to SQL and LINQ to Entities?
  8. Android 多线程之阻塞队列
  9. 华三 h3c ospf、rip 路由引入和路由策略
  10. c语言常用单词大全,c语言必背专业英语词汇大全
  11. smali java_Android逆向——初识smali与java类
  12. MySQL 读写分离配置实践
  13. 矩阵论——矩阵的标准型
  14. 识别“百度权重”作弊的方法
  15. 一、初学计算机——认识键盘布局及快捷键使用
  16. 海思Hi3521/Hi3520A/Hi3520D/Hi3515A/Hi3515C U-boot 移植应用 开发指南
  17. 如何自己制作图标文件
  18. apicloud studio 怎么开启自动wifi同步?
  19. Axis1.4发布WebService
  20. win10关闭杀毒防护

热门文章

  1. 修改linux资源限制参数命令,linux passwd命令参数及用法详解--linux修改用户密码命令...
  2. mysql中show属于_mysql show的常见用法
  3. c语言如何实现玫瑰花
  4. 原来C语言还可以这样实现“泛型编程”!
  5. 光模块和光纤收发器的区别是什么?
  6. 工业交换机和商用交换机对比
  7. [渝粤教育] 四川大学 药用植物学 参考 资料
  8. 【渝粤教育】国家开放大学2018年春季 0275-22T内科护理学 参考试题
  9. 【渝粤教育】国家开放大学2018年春季 0043-22T计算机文化 参考试题
  10. 串口服务器E810-DTU实现以太网口与RS232数据透明传输