前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >算法模板——线段树6(二维线段树:区域加法+区域求和)(求助phile)

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

作者头像
HansBug
发布2018-04-10 16:37:10
1.4K0
发布2018-04-10 16:37:10
举报
文章被收录于专栏:HansBug's LabHansBug's LabHansBug's Lab

实现功能——对于一个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.       
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-01-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档