算法模板——线段树6(二维线段树:区域加法+区域求和)(求助phile)
时间:2022-05-07
本文章向大家介绍算法模板——线段树6(二维线段树:区域加法+区域求和)(求助phile),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
实现功能——对于一个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.
- 基于AgileEAS.NET SOA 中间件领域模型数据器快速打造自己的代码生成器
- Java基础-day07-代码题-自定义数据类型;ArrayList集合
- 一条报警信息的快速处理和分析(r9笔记第99天)
- 【Go 语言社区】解析Go语言编程中的struct结构
- centos+scala2.11.4+hadoop2.3+spark1.3.1环境搭建
- 【Go 语言社区】Golang 语言获取本机逻辑CPU数量的方法
- Data Guard搭建困境突围(一)(r10笔记第17天)
- Java基础-day07-知识点相关题-自定义数据类型;ArrayList
- windows10 tensorflow(二)原理实战之回归分析,深度学习框架(梯度下降法求解回归参数)
- 本人为巨杉数据库(开源NoSQL)写的C#驱动,支持Linq,全部开源,已提交github
- 最近的几个技术问题总结和答疑(九)(r10笔记第16天)
- AgileEAS.NET SOA中间件平台更新日志 2015-04-28
- 【Go 语言社区】Golang语言操作redis连接池的方法
- 分布式消息总线,基于.NET Socket Tcp的发布-订阅框架之离线支持,附代码下载
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【python-leetcode856-子集】括号的分数
- 【python-子集】Generalized Abbreviation(广义缩写)
- spring之整合Hibernate
- 【pytorch】改造resnet为全卷积神经网络以适应不同大小的输入
- springmvc之数据的格式化
- 【python-leetcode207-拓扑排序】课程表
- 定时任务最简单的3种实现方法(Java)
- 回顾通用链表(亲测代码示例)
- 【python-leetcode210-拓扑排序】课程表Ⅱ
- Java实现最小生成树算法之Kruskal算法
- 来我们再聊聊 KMP 算法 -- 我懂,你也得懂
- 【pytorch】简单的线性回归
- 简单的并查集的实现
- 【python-leetcode269-拓扑排序】火星字典
- 通俗点聊聊算法 - 排序(3)快速排序,亲测