实现功能——对于一个N×M的方格,1:输入一个区域,将此区域全部值作加法;2:输入一个区域,求此区域全部值的和

其实和一维线段树同理,只是不知道为什么速度比想象的慢那么多,求解释。。。@acphile

(还有代码略恶心,求原谅。。。^_^)

 1 const tvp=8000000;
 2 var
 3    i,j,k,l,m,n,a1,a2,a3,a4,a5:longint;
 4    a,b:array[0..tvp] of longint;
 5    c1,c2:char;
 6 function max(x,y:longint):longint;inline;
 7          begin
 8               if x>y then max:=x else max:=y;
 9          end;
10 function min(x,y:longint):longint;inline;
11          begin
12               if x<y then min:=x else min:=y;
13          end;
14 function op(z,x1,y1,x2,y2,lx,ly,rx,ry,nu,d:longint):longint;inline;
15          var
16             a1,a2,a3,a4,a5:longint;
17          begin
18               if (lx>rx) or (ly>ry) then exit(0);
19               if (x1=lx) and (y1=ly) and (x2=rx) and (y2=ry) then
20                  begin
21                       b[z]:=b[z]+nu;
22                       exit(nu*(rx-lx+1)*(ry-ly+1));
23                  end;
24               a2:=op(z*4-2,x1,y1,(x1+x2) div 2,(y1+y2) div 2,lx,ly,min(rx,(x1+x2) div 2),min(ry,(y1+y2) div 2),nu,d);
25               a3:=op(z*4-1,x1,(y1+y2) div 2+1,(x1+x2) div 2,y2,lx,max(ly,(y1+y2) div 2+1),min(rx,(x1+x2) div 2),ry,nu,d);
26               a4:=op(z*4,(x1+x2) div 2+1,y1,x2,(y1+y2) div 2,max(lx,(x1+x2) div 2+1),ly,rx,min(ry,(y1+y2) div 2),nu,d);
27               a5:=op(z*4+1,(x1+x2) div 2+1,(y1+y2) div 2+1,x2,y2,max(lx,(x1+x2) div 2+1),max(ly,(y1+y2) div 2+1),rx,ry,nu,d);
28               a[z]:=a[z]+a2+a3+a4+a5;
29               exit(a2+a3+a4+a5);
30          end;
31 function cal(z,x1,y1,x2,y2,lx,ly,rx,ry,d:longint):longint;inline;
32          var a1,a2,a3,a4,a5:longint;
33          begin
34               if (lx>rx) or (ly>ry) then exit(0);
35               d:=d+b[z];
36               if (x1=lx) and (y1=ly) and (x2=rx) and (y2=ry) then exit(a[z]+d*(rx-lx+1)*(ry-ly+1));
37               a2:=cal(z*4-2,x1,y1,(x1+x2) div 2,(y1+y2) div 2,lx,ly,min(rx,(x1+x2) div 2),min(ry,(y1+y2) div 2),d);
38               a3:=cal(z*4-1,x1,(y1+y2) div 2+1,(x1+x2) div 2,y2,lx,max(ly,(y1+y2) div 2+1),min(rx,(x1+x2) div 2),ry,d);
39               a4:=cal(z*4,(x1+x2) div 2+1,y1,x2,(y1+y2) div 2,max(lx,(x1+x2) div 2+1),ly,rx,min(ry,(y1+y2) div 2),d);
40               a5:=cal(z*4+1,(x1+x2) div 2+1,(y1+y2) div 2+1,x2,y2,max(lx,(x1+x2) div 2+1),max(ly,(y1+y2) div 2+1),rx,ry,d);
41               exit(a2+a3+a4+a5);
42          end;
43 begin
44      readln(c1,n,m);
45      fillchar(a,sizeof(a),0);
46      fillchar(b,sizeof(b),0);
47      while not(eof) do
48            begin
49                 read(c1,a1,a2,a3,a4);
50                 case c1 of
51                      'L':begin
52                               readln(a5);
53                               op(1,1,1,n,m,a1,a2,a3,a4,a5,0);
54                      end;
55                      'k':begin
56                               readln;
57                               writeln(cal(1,1,1,n,m,a1,a2,a3,a4,0));
58                      end;
59                 end;
60            end;
61 end.       

转载于:https://www.cnblogs.com/HansBug/p/4237745.html

算法模板——线段树6(二维线段树:区域加法+区域求和)(求助phile)相关推荐

  1. 模板:二维线段树(线段树套线段树)

    文章目录 问题 解析 单点修改 询问 完整代码 标记永久化 代码 所谓二维线段树,就是有两个维度的线段树 (逃) 问题 给出一个矩形 要求支持以下操作: 1.询问一个子矩形的最值 2.修改某一个单点的 ...

  2. POJ2155二维线段树

    题意:      给一个n*n的01矩阵,然后有两种操作(m次)C x1 y1 x2 y2是把这个小矩形内所有数字异或一遍,Q x y 是询问当前这个点的值是多少?n<=1000 m<=5 ...

  3. 10.25T2 二维线段树

    Description 为了准备校庆庆典,学校招募了一些学生组成了一个方阵,准备在庆典上演出. 这个方阵是一个n*m的矩形,第i行第j列有一名学生,他有一个能力值Ai,j. 校长会定期检查一个p*q的 ...

  4. BZOJ2877 NOI2012魔幻棋盘(二维线段树)

    显然一个序列的gcd=gcd(其差分序列的gcd,序列中第一个数).于是一维情况直接线段树维护差分序列即可. 容易想到将该做法拓展到二维.于是考虑维护二维差分,查询时对差分矩阵求矩形的gcd,再对矩形 ...

  5. poj1195 Mobile phones 二维线段树入门

    二维线段树就是树套树,线段树套线段树... #include<iostream> #include<cstdio> #include<cstring> #inclu ...

  6. POJ-2155 Matrix 二维线段树 | 树状数组

    题目链接:http://poj.org/problem?id=2155 比较典型的二维线段树题目,直接永久更新即可,在询问的时候,要询问每个x区间的子树,复杂度O(log(n)^2). 也可以用树状数 ...

  7. [POJ2155] Matrix(二维线段树,树套树)

    题目链接:http://poj.org/problem?id=2155 题意:给一个01矩阵,两个操作,翻转:子矩阵里每一个数都由0变1,1变0. 查询:查询某一点是0还是1. 一直以为二维线段树就是 ...

  8. HDU1823(二维线段树)

    题目:Luck and Love 题意:当操作符为'I'时,表示有一个MM报名,后面接着一个整数,H表示身高,两个浮点数,A表示活泼度,L表示缘分值. (100<=H<=200, 0.0& ...

  9. 【NOI2019】弹跳【二维线段树】【dijkstra】

    题意:一个w×hw\times hw×h的二维平面上有nnn个城市,有mmm个弹跳装置,第iii个可以花费tit_iti​的时间从城市pip_ipi​跳到矩形x∈[l,r],y∈[u,d]x\in [ ...

  10. BZOJ.4553.[HEOI2016TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)

    题目链接:BZOJ 洛谷 \(O(n^2)\)DP很好写,对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]=d[j]+1\) for(int j=1; j<i; ++j)if(a[j ...

最新文章

  1. Ubuntu中的vi模式中的按上下左右键变成ABCD解决方法
  2. SAP Fiori Elements 在本地测试模式下如何修改 List Report 里字段标签和图标
  3. 数据库大咖解读“新基建”,墨天轮四重好礼相送!
  4. 技术实践丨手把手教你使用MQTT方式对接华为IoT平台
  5. 推行法定数字货币,现有支付宝/微信等支付系统,会否被数字货币支付系统替代并超越?
  6. 如何更改rhevm中admin的密码
  7. 对称加密、非对称加密、RSA、消息摘要、数字签名、数字证书与 HTTPS 简介
  8. apache + phpStudy 配置vue history模式
  9. 人工智能产生式系统动物识别实验python
  10. java题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数
  11. 如何修改pdf文件内容
  12. pyqt+pyqtgraph+lka(界面制作)
  13. 回波损耗、反射系数、电压驻波比以及S参数的物理意义
  14. C#编程-47:选择类控件复习笔记
  15. 华丽而实用的Java图表应用
  16. Android 12 适配攻略
  17. 行人重识别 (Re-ID)数据集介绍
  18. GAGE USB信号采集卡
  19. 安卓-QQ-课程设计
  20. Maven配置阿里云HTTPS镜像地址

热门文章

  1. 面试前,不要这么准备了,简直愚蠢到极点
  2. 使用requests通过代码实现接口测试自动化
  3. win7误删计算机,Win7系统下文件数据被误删了怎么办
  4. awk bc命令 linux_Linux 的 awk 命令教程手册,建议收藏!
  5. python字符串_(Python基础教程之七)Python字符串操作
  6. 计算机文件系统小结,文件系统总结
  7. 颜色和心理年龄测试软件,超准的色彩心理学:选8个颜色,就可以测出你的心理年龄...
  8. Alec jacobson thesis analysis
  9. 徐州工程学院计算机报名,2019年3月江苏徐州工程学院计算机等级考试报名时间...
  10. 大厂面试常问的机器学习,计算机视觉怎么学?详细指南来了!