算法模板——线段树4(区间加+区间乘+区间覆盖值+区间求和)
时间:2022-05-07
本文章向大家介绍算法模板——线段树4(区间加+区间乘+区间覆盖值+区间求和),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
实现功能——1:区间加法 2:区间乘法 3:区间覆盖值 4:区间求和
这是个四种常见线段树功能的集合版哦。。。么么哒(其实只要协调好三种tag的关系并不算太难——前提是想明白了线段树的工作模式)
代码长度几经修改后也大为缩水
还有!!!——通过BZOJ1798反复的尝试,我的出来一个重要结论——尽量减少pushup操作的不必要使用次数,对于程序提速有明显的效果!!!
1 type vet=record
2 a0,a1:longint;
3 end;
4 var
5 i,j,k,l,m,n,a1,a2,a3:longint;
6 d1:vet;
7 a,b,d:array[0..100000] of longint;
8 c:array[0..100000] of vet;
9 function max(x,y:longint):longint;inline;
10 begin
11 if x>y then max:=x else max:=y;
12 end;
13 function min(x,y:longint):longint;inline;
14 begin
15 if x<y then min:=x else min:=y;
16 end;
17 function merge(d1,d2:vet):vet;inline;
18 var d3:vet;
19 begin
20 d3:=d1;
21 d3.a0:=d3.a0*d2.a0;
22 d3.a1:=d3.a1*d2.a0+d2.a1;
23 exit(d3);
24 end;
25 procedure ext(z,x,y:longint);inline;
26 begin
27 if d[z]=1 then
28 begin
29 a[z]:=b[z]*(y-x+1);
30 c[z].a0:=1;c[z].a1:=0;
31 if x<>y then
32 begin
33 b[z*2]:=b[z];d[z*2]:=1;
34 b[z*2+1]:=b[z];d[z*2+1]:=1;
35 end;
36 b[z]:=0;d[z]:=0;
37 end
38 else
39 begin
40 a[z]:=a[z]*c[z].a0+c[z].a1*(y-x+1);
41 if x<>y then
42 begin
43 if d[z*2]=1 then ext(z*2,x,(x+y) div 2);
44 if d[z*2+1]=1 then ext(z*2+1,(x+y) div 2+1,y);
45 c[z*2]:=merge(c[z*2],c[z]);
46 c[z*2+1]:=merge(c[z*2+1],c[z]);
47 end;
48 c[z].a0:=1;c[z].a1:=0;
49 end;
50 end;
51 procedure built(z,x,y:longint);inline;
52 begin
53 if x=y then
54 read(a[z])
55 else
56 begin
57 built(z*2,x,(x+y) div 2);
58 built(z*2+1,(x+y) div 2+1,y);
59 a[z]:=a[z*2]+a[z*2+1];
60 end;
61 b[z]:=0;d[z]:=0;
62 c[z].a0:=1;c[z].a1:=0;
63 end;
64 function op(z,x,y,l,r:longint;d1:vet):longint;inline;
65 var a2,a3:longint;
66 begin
67 if l>r then exit(0);
68 ext(z,x,y);
69 if (x=l) and (y=r) then
70 begin
71 c[z]:=d1;
72 exit((d1.a0-1)*a[z]+d1.a1*(r-l+1));
73 end;
74 a2:=op(z*2,x,(x+y) div 2,l,min(r,(x+y) div 2),d1);
75 a3:=op(z*2+1,(x+y) div 2+1,y,max(l,(x+y) div 2+1),r,d1);
76 a[z]:=a[z]+a2+a3;
77 exit(a2+a3);
78 end;
79 function cover(z,x,y,l,r,p:longint):longint;inline;
80 var a2,a3:longint;
81 begin
82 if l>r then exit(0);
83 ext(z,x,y);
84 if (x=l) and (y=r) then
85 begin
86 d[z]:=1;b[z]:=p;
87 exit(p*(r-l+1)-a[z]);
88 end;
89 a2:=cover(z*2,x,(x+y) div 2,l,min(r,(x+y) div 2),p);
90 a3:=cover(z*2+1,(x+y) div 2+1,y,max(l,(x+y) div 2+1),r,p);
91 a[z]:=a[z]+a2+a3;
92 exit(a3+a2);
93 end;
94 function cal(z,x,y,l,r:longint):longint;
95 begin
96 if l>r then exit(0);
97 ext(z,x,y);
98 if (x=l)and (y=r) then exit(a[z]);
99 exit(cal(z*2,x,(x+y) div 2,l,min(r,(x+y) div 2))+cal(z*2+1,(x+y) div 2+1,y,max(l,(x+y) div 2+1),r));
100 end;
101 begin
102 readln(n,m);
103 built(1,1,n);
104 readln;
105 for i:=1 to m do
106 begin
107 read(j);
108 case j of
109 1:begin //区间加
110 readln(a1,a2,a3);
111 d1.a0:=1;d1.a1:=a3;
112 op(1,1,n,a1,a2,d1);
113 end;
114 2:begin //区间乘
115 readln(a1,a2,a3);
116 d1.a0:=a3;d1.a1:=0;
117 op(1,1,n,a1,a2,d1);
118 end;
119 3:begin //区间覆盖值
120 readln(a1,a2,a3);
121 cover(1,1,n,a1,a2,a3);
122 end;
123 4:begin //区间求和
124 readln(a1,a2);
125 writeln(cal(1,1,n,a1,a2));
126 end;
127 else halt;
128 end;
129 end;
130 end.
131
- spring-data-mongodb之MongoTemplate 删除操作
- 总结了一些指针易出错的常见问题(六)
- spring-data-mongodb之MongoTemplate 修改数据
- spring-data-mongodb之MongoTemplate 添加数据
- Cannot create a session after the response has been committed
- spring-data-mongodb之环境准备(1)
- java8 Lambda尝尝鲜
- spring-data-mongodb之批量更新操作
- spring-data-mongodb之Aggregation
- spring-data-mongodb之gridfs
- spring-data-mongodb之自增ID实现
- spring-data-mongodb之Repositor操作数据
- mongodb java操作语法
- spring-data-mongodb之查询操作
- 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 数组属性和方法
- Phaser类在性能测试中应用
- Mockito框架Mock Void方法
- 未来的神器fiddler Everywhere
- Sentinel整合Apollo进行规则持久化
- DevTools(Chrome 85)的新功能
- 在Node.js中处理Zip文件
- 构建一个带身份验证的 Deno 应用
- Sentinel整合Apollo进行规则持久化(二)
- Sentinel整合Apollo进行规则持久化(三)
- BeesCMS的SQL注入漏洞
- 操作系统的演变及在云计算的应用
- 没root账号,如何安装perl包
- 从 BIO、NIO 聊到 Netty,还要手写一个 RPC 框架!毕设/项目经验稳了!
- 从100万条数据中找到极大值所在行
- 常考题 | IoU 计算