算法模板——线段树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 ...
随机推荐
- #图# #SPFA# #Tarjan# ----- BZOJ1179
SPFA算法 SPFA(Shortest Path Faster Algorithm)(队列优化)算法是求单源最短路径的一种算法. 判负环(在差分约束系统中会得以体现).如果某个点进入队列的次数超过N ...
- 《RDLC部署》RDLC部署到IIS缺少DLL程序集
1.错误:从vs生成网站部署到服务器后打开RDLC报表却提示缺少DLL程序集. 一般是缺少如下文件 1. Microsoft.ReportViewer.Common.dll 2. Microsof ...
- Bootstrap入门(十四)组件8:媒体对象
Bootstrap入门(十四)组件8:媒体对象 这是一个抽象的样式,用以构建不同类型的组件,这些组件都具有在文本内容的左或右侧对齐的图片(就像博客评论或 Twitter 消息等). 1.基本样式 2. ...
- CODEFORCES 125E MST Company 巧用Kruskal算法
题意:给定一个带权边无向图,求最小生成树,且满足第一个节点的度为固定的k 无解则输出-1 数据规模: 节点数n和限制k<=5000 边数m<=10^5 时限8sec 思路: 首先时限比较宽 ...
- js如何判断一个变量是否是数组?
//方法一 var arr = [1,2,3]; var obj = {'name': 'xiaoming','age': 19}; if(arr.constructor == Array){ ale ...
- 蓝桥网试题 java 入门训练 Fibonacci数列
---------------------------------------------------------------------------------------------------- ...
- [2017.02.07] Lua入门学习记录
#!/home/auss/Projects/Qt/annotated/lua -- 这是第一次系统学习Lua语言 --[[ 参考资料: 1. [Lua简明教程](http://coolshell.cn ...
- .net 网站应对压力的一些方案总结
开年比较空,抽时间写个博文,总结下自己工作里的一些应对网站访问压力的技术方案. 自己项目现在大概一天50W的pv.已从前端到后端的顺序总结下自己用的一些方案. 一. 前端页面: 1.首先减少资源的大小 ...
- 【noip 2009】 乌龟棋 记忆化搜索&动规
题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起 ...
- css3 过渡和2d变换——回顾
1.transition 语法:transition: property duration timing-function delay; transition-property 设置过渡效果的css ...