题目描述

这是一道模板题。

给定一个大小为 N \times MN×M 的零矩阵,直到输入文件结束,你需要进行若干个操作,操作有两类:

  • 1 a b c d x,表示将左上角为 (a,b)(a,b),右下角为 (c,d)(c,d) 的子矩阵全部加上 xx;

  • 2 a b c d,表示询问左上角为 (a,b)(a,b),右下角为 (c,d)(c,d) 为顶点的子矩阵的所有数字之和。

输入格式

第一行一个字符和两个正整数 ,其中 n,mn,m 分别表示矩阵的行数与列数。

接下来若干行直到文件结束,均代表你需要进行的操作。

输出格式

对于每个 2 操作,输出一行代表查询的结果。

样例

样例输入

4 4
1 1 1 3 3 2
1 2 2 4 4 1
2 2 2 3 3

样例输出

12

数据范围与提示

对于 10\%10% 的数据,1 \le n,m \le 161≤n,m≤16,操作不超过 200200 个;
对于 60\%60% 的数据,1 \le n,m \le 5121≤n,m≤512;
对于 100\%100% 的数据,1 \le n,m \le 2048,\lvert x \rvert \le 5001≤n,m≤2048,∣x∣≤500,操作不超过 2\times 10^52×105 个,保证运算过程中及最终结果均不超过 6464 位带符号整数类型的表示范围,并且修改与查询的子矩阵存在。

#include<bits/stdc++.h>using namespace std;
const int N=2100;
long long s1[N][N],s2[N][N],s3[N][N],s4[N][N];
int n,m;
int lowbit(int x)
{return x&(-x);
}void updata(int x,int y,long long z)
{for(int i=x;i<=n;i+=lowbit(i)){for(int j=y;j<=n;j+=lowbit(j)){s1[i][j]+=z;s2[i][j]+=x*z;s3[i][j]+=y*z;s4[i][j]+=x*y*z;}}
}
long long sum(int x,int y)
{long long res=0;for(int i=x;i>0;i-=lowbit(i)){for(int j=y;j>0;j-=lowbit(j)){res+=(x+1)*(y+1)*s1[i][j]-(y+1)*s2[i][j]-(x+1)*s3[i][j]+s4[i][j];}}return res;
}
int main()
{while(scanf("%d %d",&n,&m)==2){memset(s1,0,sizeof(s1));memset(s2,0,sizeof(s2));memset(s3,0,sizeof(s3));memset(s4,0,sizeof(s4));int k;while(scanf("%d",&k)==1){if(k==1){int a,b,c,d;long long x;scanf("%d %d %d %d %lld",&a,&b,&c,&d,&x);updata(a,b,x);updata(c+1,b,-x);updata(a,d+1,-x);updata(c+1,d+1,x);}else{int x1,y1,x2,y2;scanf("%d %d %d %d",&x1,&y1,&x2,&y2);printf("%lld\n",sum(x2,y2)-sum(x1-1,y2)-sum(x2,y1-1)+sum(x1-1,y1-1));}}}return 0;
}

转载于:https://www.cnblogs.com/chenchen-12/p/10189009.html

#135. 二维树状数组 3:区间修改,区间查询相关推荐

  1. 二维树状数组模板(区间修改+区间查询)

    二维树状数组模板(区间修改+区间查询) 例题:JOIOI上帝造题的七分钟 一共两种操作: \(L\ x_1\ y_1\ x_2\ y_2\ d\):把\((x_1,y_1)\),\((x_2,y_2) ...

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

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

  3. 树状数组 / 二维树状数组

    一维树状数组 · 单点修改 + 单点查询: 直接使用即可 · 区间修改 + 单点查询: 另外维护一个维护前缀和的树状数组,查询时查询与原值相加即可. · 区间修改 + 区间查询: 若要查询区间$[1, ...

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

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

  5. 【LuoguP3038/[USACO11DEC]牧草种植Grass Planting】树链剖分+树状数组【树状数组的区间修改与区间查询】...

    模拟题,可以用树链剖分+线段树维护. 但是学了一个厉害的..树状数组的区间修改与区间查询.. 分割线里面的是转载的: ----------------------------------------- ...

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

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

  7. UESTC 1601 艾尔大停电2 二维树状数组+区间更新

    艾尔大停电2 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  S ...

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

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

  9. hdu 1892二维树状数组

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

最新文章

  1. windows API 创建系统托盘图标
  2. (HDU)1491-- Octorber 21st (校庆)
  3. 古董来了:1999年的物件,香港已经回归了,我都上初中了,那么你出生了吗?
  4. Web Magic 总体架构
  5. eclipse怎么显示代码行数
  6. Java输出数字到文本文件FileWriter
  7. DATEDIFF() 函数返回两个日期之间的天数
  8. 使用struts2来防止表单重复提交
  9. hibernate 里面 mysql dialect 配置
  10. linux安装富士施乐打印机驱动下载,Ubuntu 8.04下安装Xerox打印机记录
  11. 关于网页背景图怎样自动适应屏幕大小
  12. compiled.php,laravel compiled.php 缓存 命令行
  13. 用什么擦地最干净脑筋急转弯_小学生语文试卷:为什么秋天大雁要飞回南方?答案让人“喷饭”...
  14. 武清鸿蒙幼儿园,天津十大贵族学校,土豪才上的起的学校!
  15. 基于STM32的实时操作系统FreeRTOS移植教程(手动移植)
  16. 2022年诺贝尔物理学奖的科学内涵辨识
  17. HDU 4735 舞蹈链可重复覆盖
  18. 2021-03-05 pandas(合并_分组聚合_复合索引)
  19. CentOS7 export命令
  20. ubuntu安装nvidia官方驱动(安装CUDA7.5之后,找不到TITAN显卡的解决方法)

热门文章

  1. Capsule下一代CNN深入探索
  2. JZOJ 5603. 【NOI2018模拟3.27】Xjz
  3. 参考平面及其高度_GCB | 盐沼和红树林湿地类型的转变会改变亚热带湿地对于海平面上升的脆弱性么?...
  4. css 透明_css属性transparent有时候并不是透明的
  5. 关联规则挖掘算法_数据挖掘 | 关联规则分析
  6. 水木-机器学习推荐论文和书籍
  7. java 32 questions
  8. [BZOJ 1012] 最大数maxnumber
  9. 无障碍开发(三)之ARIA aria-***属性值
  10. JS将数字转换为带有单位的中文表示