算法模板——线段树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 ...
随机推荐
- Java 的String类
String类 1.String对象的初始化 由于String对象特别常用,所以在对String对象进行初始化时,Java提供了一种简化的特殊语法,格式如下: String s = “abc”; s ...
- web前端性能调优(二)
项目经过第一波优化之后APP端已基本已经符合我们的要求了,但是TV端还是反应比较慢,页面加载和渲染都比较慢了一点,我觉的还是有必要在进行一些优化,经过前面的优化,我们的优化空间已经小了一部分,不过还是 ...
- CodeForces 722B
B. Verse Pattern time limit per test:1 second memory limit per test:256 megabytes input:standard inp ...
- Cent OS U盘安装不成功问题
环境: CentOS 版本:CentOS-7-x86_64-DVD-1611 镜像烧写工具:UltraISO 9.5.3.2901,Win7 硬件:J1900+16G SSD+4G RAM,金士顿16 ...
- [CSS3] 学习笔记-HTML与CSS简单页面效果实例
一个简单的首页的设计: html文件: <!doctype html> <html> <head> <meta charset="UTF-8&quo ...
- TV端:通过遥控器的点击实现图片的上下左右抖动的效果
做TV端有一段时间了,我看到别的TV上有一个通过遥控器的触摸板来控制一张图片的相应方向的抖动,感觉听新奇的,就试着做了一个分享一下: 转载注明出处:http://www.cnblogs.com/hyy ...
- C++编程练习(2)----“实现简单的线性表的链式存储结构“
单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素. 对于查找操作,单链表的时间复杂度为O(n). 对于插入和删除操作,单链表在确定位置后,插入和删除时间仅为O(1). 单链表不需要分配存储 ...
- 【.Net Framework 体积大?】不安装.net framework 也能运行!?原理简介-2
接上一篇 [.Net Framework 体积大?]不安装.net framework 也能运行!?开篇叙述-1 昨天写了一个引子,还是有读者对这套“小把戏”感兴趣.那么不辜负大家的希望,争取博主不做 ...
- android之intent显式,显式学习
intent,意图 当从一个Activity到另一个Activity时调用,这里重点学习显式,隐式的使用 使用语句上的区别: 隐式意图: 显式意图: setAction ...
- 毕向东udp学习笔记3多线程聊天
项目功能: 实现了多线程下的发送接收,比较好 希望可以加入GUI,类似聊天软件一样,有一个消息输入框,捕获输入消息,作为发送线程 有一个显示消息框,接收消息并显示,作为接收线程 不知道的是,当在线程中 ...