算法模板——线段树1(区间加法+区间求和)
时间:2022-05-07
本文章向大家介绍算法模板——线段树1(区间加法+区间求和),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
实现功能——1:区间加法;2:区间求和
最基础最经典的线段树模板。由于这里面操作无顺序之分,所以不需要向下pushup,直接累积即可
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
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 教你如何用Paddle.js开发智能化微信小程序
- Spark+Kudu的广告业务项目实战笔记(一)
- Java的新未来:逐渐“Kotlin化”
- 用 GitLab 做 CI/CD 是什么感觉,太强了!!
- 避坑指南:通过expdp/impdp迁移数据的7个坑
- 组复制背景 | 全方位认识 MySQL 8.0 Group Replication
- kubernete编排技术六:RBAC权限控制
- Redis 的过期策略是如何实现的?
- 记一次线上问题及反思
- 用 Redis 散列实现短网址生成器|文末福利
- 原创|面试官:Java对象一定分配在堆上吗?
- 频繁FGC的真凶原来是它
- 类加载器知识点吐血整理
- ThreadPoolExecutor 线程池"源码分析"
- 一起刷 leetcode 之螺旋矩阵(头条和美团真题)