算法模板——线段树6(二维线段树:区域加法+区域求和)(求助phile)
实现功能——对于一个N×M的方格,1:输入一个区域,将此区域全部值作加法;2:输入一个区域,求此区域全部值的和
其实和一维线段树同理,只是不知道为什么速度比想象的慢那么多,求解释。。。@acphile
(还有代码略恶心,求原谅。。。^_^)
const tvp=;
var
i,j,k,l,m,n,a1,a2,a3,a4,a5:longint;
a,b:array[..tvp] of longint;
c1,c2:char;
function max(x,y:longint):longint;inline;
begin
if x>y then max:=x else max:=y;
end;
function min(x,y:longint):longint;inline;
begin
if x<y then min:=x else min:=y;
end;
function op(z,x1,y1,x2,y2,lx,ly,rx,ry,nu,d:longint):longint;inline;
var
a1,a2,a3,a4,a5:longint;
begin
if (lx>rx) or (ly>ry) then exit();
if (x1=lx) and (y1=ly) and (x2=rx) and (y2=ry) then
begin
b[z]:=b[z]+nu;
exit(nu*(rx-lx+)*(ry-ly+));
end;
a2:=op(z*-,x1,y1,(x1+x2) div ,(y1+y2) div ,lx,ly,min(rx,(x1+x2) div ),min(ry,(y1+y2) div ),nu,d);
a3:=op(z*-,x1,(y1+y2) div +,(x1+x2) div ,y2,lx,max(ly,(y1+y2) div +),min(rx,(x1+x2) div ),ry,nu,d);
a4:=op(z*,(x1+x2) div +,y1,x2,(y1+y2) div ,max(lx,(x1+x2) div +),ly,rx,min(ry,(y1+y2) div ),nu,d);
a5:=op(z*+,(x1+x2) div +,(y1+y2) div +,x2,y2,max(lx,(x1+x2) div +),max(ly,(y1+y2) div +),rx,ry,nu,d);
a[z]:=a[z]+a2+a3+a4+a5;
exit(a2+a3+a4+a5);
end;
function cal(z,x1,y1,x2,y2,lx,ly,rx,ry,d:longint):longint;inline;
var a1,a2,a3,a4,a5:longint;
begin
if (lx>rx) or (ly>ry) then exit();
d:=d+b[z];
if (x1=lx) and (y1=ly) and (x2=rx) and (y2=ry) then exit(a[z]+d*(rx-lx+)*(ry-ly+));
a2:=cal(z*-,x1,y1,(x1+x2) div ,(y1+y2) div ,lx,ly,min(rx,(x1+x2) div ),min(ry,(y1+y2) div ),d);
a3:=cal(z*-,x1,(y1+y2) div +,(x1+x2) div ,y2,lx,max(ly,(y1+y2) div +),min(rx,(x1+x2) div ),ry,d);
a4:=cal(z*,(x1+x2) div +,y1,x2,(y1+y2) div ,max(lx,(x1+x2) div +),ly,rx,min(ry,(y1+y2) div ),d);
a5:=cal(z*+,(x1+x2) div +,(y1+y2) div +,x2,y2,max(lx,(x1+x2) div +),max(ly,(y1+y2) div +),rx,ry,d);
exit(a2+a3+a4+a5);
end;
begin
readln(c1,n,m);
fillchar(a,sizeof(a),);
fillchar(b,sizeof(b),);
while not(eof) do
begin
read(c1,a1,a2,a3,a4);
case c1 of
'L':begin
readln(a5);
op(,,,n,m,a1,a2,a3,a4,a5,);
end;
'k':begin
readln;
writeln(cal(,,,n,m,a1,a2,a3,a4,));
end;
end;
end;
end.
算法模板——线段树6(二维线段树:区域加法+区域求和)(求助phile)的更多相关文章
- 【BZOJ4785】[Zjoi2017]树状数组 树套树(二维线段树)
[BZOJ4785][Zjoi2017]树状数组 Description 漆黑的晚上,九条可怜躺在床上辗转反侧.难以入眠的她想起了若干年前她的一次悲惨的OI 比赛经历.那是一道基础的树状数组题.给出一 ...
- 算法模板——计算几何2(二维凸包——Andrew算法)
实现功能:求出二维平面内一对散点的凸包(详见Codevs 1298) 很神奇的算法——先将各个点按坐标排序,然后像我们所知的那样一路左转,求出半边的凸包,然后反过来求另一半的凸包 我以前正是因为总抱着 ...
- poj 2155 matrix 二维线段树 线段树套线段树
题意 一个$n*n$矩阵,初始全为0,每次翻转一个子矩阵,然后单点查找 题解 任意一种能维护二维平面的数据结构都可以 我这里写的是二维线段树,因为四分树的写法复杂度可能会退化,因此考虑用树套树实现二维 ...
- hdu 4819 二维线段树模板
/* HDU 4819 Mosaic 题意:查询某个矩形内的最大最小值, 修改矩形内某点的值为该矩形(Mi+MA)/2; 二维线段树模板: 区间最值,单点更新. */ #include<bits ...
- HDU1832 二维线段树求最值(模板)
Luck and Love Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- hdu1823(二维线段树模板题)
hdu1823 题意 单点更新,求二维区间最值. 分析 二维线段树模板题. 二维线段树实际上就是树套树,即每个结点都要再建一颗线段树,维护对应的信息. 一般一维线段树是切割某一可变区间直到满足所要查询 ...
- Luck and Love(二维线段树)
Luck and Love Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- bzoj4785:[ZJOI2017]树状数组:二维线段树
分析: "如果你对树状数组比较熟悉,不难发现可怜求的是后缀和" 设数列为\(A\),那么可怜求的就是\(A_{l-1}\)到\(A_{r-1}\)的和(即\(l-1\)的后缀减\( ...
- HDU 4819 Mosaic (二维线段树&区间最值)题解
思路: 二维线段树模板题,马克一下,以后当模板用 代码: #include<cstdio> #include<cmath> #include<cstring> #i ...
- [BZOJ4785][ZJOI2017]树状数组(概率+二维线段树)
4785: [Zjoi2017]树状数组 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 297 Solved: 195[Submit][Status ...
随机推荐
- Spring 集成 Dubbo
Duboo是什么 DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次 ...
- UTF编码检测
最近工作上正好需要进行UTF编码检测,自己写了一个,分享给大家,希望可以帮得上有需要用的朋友 public bool isUtf8(byte[] rawText) { bool result = tr ...
- 蓝桥网试题 java 基础练习 十六进制转十进制
---------------------------------------------------------------------------------------- 貌似用int类型不会超 ...
- ArcGIS Pro 简明教程(3)数据编辑
ArcGIS Pro 简明教程(3)数据编辑 by 李远祥 数据编辑是GIS中最常用的功能之一,ArcGIS Pro在GIS数据编辑上使用习惯有一定的改变,因此,本章可以重点看看一些编辑工具的使用和使 ...
- io的四个分类
1.首先是字节操作:InputStream和OutputStream 2.字符操作:Reader和Writer 3.磁盘操作:File 4.网络操作:scoket(不在java.io包)
- [译] AR SDK的种类比你想得要多!这里介绍七个棒棒哒
作者:Eddie Offermann 原文:There are dozens more Augmented Reality SDKs than you think! Here are seven gr ...
- Robot Framework的安装
一.安装环境:Windows 64位操作系统64位2.7版本Python 二.简要步骤:1. 安装Python(RF是基于python 的,所以需要有python环境):2. 安装wxPython ( ...
- Yarn init 命令在 Git Bash 中打开时的错误
最近一直在学习一些新的知识,ES5.ES6.Vue等,当然,作为程序,英文的阅读和听写能力也是要去学习的. 最近慕课网上的qbaty大神出了两套视频,分别是webpack和yarn,本着不断学习的精神 ...
- js加载XML文件
// XML文件 <?xml version="1.0" encoding="gb2312"?> <root> <father n ...
- pyqt的 .ui 转换为 .py 后的操作注意事项
1. 增加 import sys 2. 将 Ui_MainWindow(object) 中的 object 修改成修改成 QtGui.QMainWindow 3. 在 Ui_MainWindow 类中 ...