算法模板——线段树5(区间开根+区间求和)
时间:2022-05-07
本文章向大家介绍算法模板——线段树5(区间开根+区间求和),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
实现功能——1:区间开根;2:区间求和(此模板以BZOJ3038为例)
作为一个非常规的线段树操作,其tag也比较特殊呵呵哒
1 var
2 i,j,k,l,m,n:longint;
3 a,b:array[0..500000] of int64;
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 begin
16 read(a[z]);
17 if a[z]<=1 then b[z]:=1 else b[z]:=0;
18 end
19 else
20 begin
21 built(z*2,x,(x+y) div 2);
22 built(z*2+1,(x+y) div 2+1,y);
23 a[z]:=a[z*2]+a[z*2+1];
24 if (b[z*2]=1) and (b[z*2+1]=1) then b[z]:=1 else b[z]:=0;
25 end;
26 end;
27 function op(z,x,y,l,r:longint):int64;inline;
28 var a2,a3,a4:int64;
29 begin
30 if l>r then exit(0);
31 if b[z]=1 then exit(0);
32 if (x=l) and (y=r) and (l=r) then
33 begin
34 a2:=a[z];
35 a[z]:=trunc(sqrt(a[z]));
36 if a[z]<=1 then b[z]:=1;
37 exit(a[z]-a2);
38 end;
39 a2:=op(z*2,x,(x+y) div 2,l,min((x+y) div 2,r));
40 a3:=op(z*2+1,(x+y) div 2+1,y,max((x+y) div 2+1,l),r);
41 a[z]:=a[z]+a2+a3;
42 if (b[z*2]=1) and (b[z*2+1]=1) then b[z]:=1;
43 exit(a2+a3);
44 end;
45 function cal(z,x,y,l,r:longint):int64;inline;
46 begin
47 if l>r then exit(0);
48 if (x=l) and (y=r) then exit(a[z]);
49 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((x+y) div 2+1,l),r));
50 end;
51 procedure swap(var x,y:longint);inline;
52 var z:longint;
53 begin
54 z:=x;x:=y;y:=z;
55 end;
56
57 begin
58 readln(n);
59 built(1,1,n);
60 readln;
61 readln(m);
62 for i:=1 to m do
63 begin
64 readln(j,k,l);
65 if k>l then swap(k,l);
66 case j of
67 1:writeln(cal(1,1,n,k,l));
68 0:op(1,1,n,k,l);
69 end;
70 end;
71 end.
72
- 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 数组属性和方法
- Jackson 的 JsonManagedReference 和 JsonBackReference 注解
- leetcode哈希表之独一无二的出现次数
- Vue 网站首页加载优化
- Swift日常开发随笔
- vue入门003~vue项目引入element并创建一个登录页面
- vue入门002~vue项目的两种创建方式
- IntelliJ IDEA,WebStorm,PhpStorm破解到2089年
- 小程序订阅消息推送(含源码)java实现小程序推送,springboot实现微信消息推送
- 借助云开发10行代码实现短信验证码的发送
- 借助云开发实现小程序订阅消息(模板消息)推送功能
- 1小时实战入门小程序开发,历史上的今天案例讲解
- 小程序实现全屏幕高斯模糊背景图
- 小程序顶部导航栏,可滑动,可动态选中放大
- 小程序不同页面的异步回调,callback和promise的使用讲解
- java入门019~springboot批量导入excel数据到mysql