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

算法模板——线段树1(区间加法+区间求和)

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

实现功能——1:区间加法;2:区间求和

最基础最经典的线段树模板。由于这里面操作无顺序之分,所以不需要向下pushup,直接累积即可

代码语言:javascript
复制
 1 var
 2    i,j,k,l,m,n,a1,a2,a3,a4:longint;
 3    a,b:array[0..100000] of longint;
 4 function max(x,y:longint):longint;inline;
 5          begin
 6               if x>y then max:=x else max:=y;
 7          end;
 8 function min(X,Y:LOngint):longint;inline;
 9          begin
10               if x<y then min:=x else min:=y;
11          end;
12 procedure built(z,x,y:longint);inline;
13           begin
14                if x=y then
15                   read(a[z])
16                else
17                    begin
18                         built(z*2,x,(x+y) div 2);
19                         built(z*2+1,(x+y) div 2+1,y);
20                         a[z]:=a[z*2]+a[z*2+1];
21                    end;
22                b[z]:=0;
23           end;
24 function op(z,x,y,l,r,d:longint):longint;inline;
25          var a3,a4:longint;
26          begin
27               if l>r then exit(0);
28               if (x=l) and (r=y) then
29                  begin
30                       b[z]:=b[z]+d;
31                       exit(d*(r-l+1));
32                  end;
33               a3:=op(z*2,x,(x+y) div 2,l,min(r,(x+y) div 2),d);
34               a4:=op(z*2+1,(x+y) div 2+1,y,max((x+y) div 2+1,l),r,d);
35               a[z]:=a[z]+a3+a4;
36               exit(a3+a4);
37          end;
38 function cal(z,x,y,l,r,d:longint):longint;inline;
39          begin
40               if l>r then exit(0);d:=d+b[z];
41               if (x=l) and (y=r) then exit(a[z]+d*(r-l+1));
42               exit(cal(z*2,x,(x+y) div 2,l,min(r,(x+y) div 2),d)+cal(z*2+1,(x+y) div 2+1,y,max(l,(x+y) div 2+1),r,d));
43          end;
44 begin
45      readln(n,m);
46      built(1,1,n);
47      readln;
48      for i:=1 to m do
49          begin
50               read(j);
51               case j of
52                    1:begin
53                           readln(a1,a2,a3);
54                           op(1,1,n,a1,a2,a3);
55                    end;
56                    2:begin
57                           readln(a1,a2);
58                           writeln(cal(1,1,n,a1,a2,0));
59                    end;
60                    else halt;
61               end;
62          end;
63 end.
64                    
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-01-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

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