算法模板——线段树9(区间加+区间求和+区间方和)
时间:2022-05-08
本文章向大家介绍算法模板——线段树9(区间加+区间求和+区间方和),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
如题,实现一个程序,输入N个数,进行如下维护:
1.1 x y 求[x,y]区间的和
2.2 x y 求[x,y]区间的平方和
3.3 x y z 将[x,y]区间全部加上z
4.4 x y 求[x,y]区间内两两数相乘的积之和(其实4是1、2的简单组合)
如下:
1 var
2 i,j,k,l,m,n:longint;
3 t:int64;
4 a,b,c:array[0..100000] of int64;
5 type
6 rec=record
7 aa,bb:int64;
8 end;
9
10 function max(x,y:longint):longint;
11 begin
12 if x>y then max:=x else max:=y;
13 end;
14 function min(x,y:longint):longint;
15 begin
16 if x<y then min:=x else min:=y;
17 end;
18 procedure built(z,x,y:longint);
19 begin
20 if x=y then
21 begin
22 read(a[z]);
23 b[z]:=a[z]*a[z];
24 end
25 else
26 begin
27 built(z*2,x,(x+y) div 2);
28 built(z*2+1,(x+y) div 2+1,y);
29 a[z]:=a[z*2]+a[z*2+1];
30 b[z]:=b[z*2]+b[z*2+1];
31 end;
32 c[z]:=0;
33 end;
34 procedure ext(z,x,y:longint);
35 begin
36 if c[z]=0 then exit;
37 b[z]:=b[z]+2*c[z]*a[z]+(y-x+1)*c[z]*c[z];
38 a[z]:=a[z]+(y-x+1)*c[z];
39 if x<>y then
40 begin
41 c[z*2]:=c[z*2]+c[z];
42 c[z*2+1]:=c[z*2+1]+c[z];
43 end;
44 c[z]:=0;
45 end;
46 function suma(z,x,y,l,r:longint):int64;
47 begin
48 if l>r then exit(0);
49 ext(z,x,y);
50 if (x=l) and (y=r) then exit(a[z]);
51 exit(suma(z*2,x,(x+y) div 2,l,min(r,(x+y) div 2))+suma(z*2+1,(x+y) div 2+1,y,max((x+y) div 2+1,l),r));
52 end;
53 function sumb(z,x,y,l,r:longint):int64;
54 begin
55 if l>r then exit(0);
56 ext(z,x,y);
57 if (x=l) and (y=r) then exit(b[z]);
58 exit(sumb(z*2,x,(x+y) div 2,l,min(r,(x+y) div 2))+sumb(z*2+1,(x+y) div 2+1,y,max((x+y) div 2+1,l),r));
59 end;
60 function add(z,x,y,l,r:longint;t:int64):rec;
61 var tt,tt1,tt2:rec;
62 begin
63 tt.aa:=0;tt.bb:=0;
64 if l>r then exit(tt);
65 if (x=l) and (y=r) then
66 begin
67 tt.aa:=t*(r-l+1);
68 tt.bb:=2*t*(a[z]+c[z]*(r-l+1))+t*t*(r-l+1);
69 c[z]:=c[z]+t;
70 exit(tt);
71 end;
72 ext(z,x,y);
73 tt1:=add(z*2,x,(x+y) div 2,l,min(r,(x+y) div 2),t);
74 tt2:=add(z*2+1,(x+y) div 2+1,y,max((x+y) div 2+1,l),r,t);
75 tt.aa:=tt1.aa+tt2.aa;
76 tt.bb:=tt1.bb+tt2.bb;
77 a[z]:=a[z]+tt.aa;
78 b[z]:=b[z]+tt.bb;
79 exit(tt);
80 end;
81 begin
82 readln(n);
83 built(1,1,n);
84 while true do
85 begin
86 read(j,k,l);
87 case j of
88 1:begin
89 writeln(suma(1,1,n,k,l));
90 end;
91 2:begin
92 writeln(sumb(1,1,n,k,l));
93 end;
94 3:begin
95 read(t);
96 add(1,1,n,k,l,t);
97 end;
98 4:begin
99 t:=suma(1,1,n,k,l);
100 writeln((t*t-sumb(1,1,n,k,l)) div 2);
101 end;
102 end;
103 readln;
104 end;
105 end.
106
- pyTorch基础入门练习
- 昨天遇到的几个常用函数
- 【深入浅出】一篇超棒的机器学习入门文章
- .NET中的异步编程上
- 从python2到python3
- 【干货】如何写代码 -编程内功心法
- .NET中的异步编程下
- 深度学习数学基础一--最小二乘法
- 【LeetCode 344】关关的刷题日记26 Reverse String
- 基于AOE网的关键路径的求解
- 【LeetCode 122】关关刷题日记25-Best Time to Buy and Sell Stock II
- 【干货】python正则表达式应用笔记
- .NET跨平台之旅:将示例站点从 ASP.NET 5 RC1 升级至 ASP.NET Core 1.0
- .NET跨平台之旅:在Linux上以本地机器码(native)运行ASP.NET Core站点
- 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 数组属性和方法
- 小书MybatisPlus第8篇-逻辑删除实现及API细节精讲
- 小书MybatisPlus第7篇-代码生成器的原理精讲及使用方法
- 小书MybatisPlus第6篇-主键生成策略精讲
- Spring Security OAuth2之resource_id配置与验证
- 了解红黑树的起源,理解红黑树的本质
- 在java中进行日期时间比较的4种方法
- 【crossbeam系列】4 crossbeam-channel:加强版channel
- 不想得手指关节炎?帮你提炼IDEA常用代码补全操作
- SpringBoot实现本地存储文件上传及提供HTTP访问服务
- 从 0 到 1 搭建技术中台之 iOS 可视化埋点实践
- 超给力,一键生成数据库文档-数据库表结构逆向工程
- 精讲RestTemplate第6篇-文件上传下载与大文件流式下载
- 【Rust日报】2020-09-12 Apple 使用 Rust 进行底层编程
- 精讲RestTemplate第4篇-POST请求方法使用详解
- 精讲RestTemplate第3篇-GET请求使用方法详解