线段树;区间求和优化

news/2025/10/27 19:15:07/文章来源:https://www.cnblogs.com/Liuxb-oier/p/19167258

线段树;区间求和优化

线段树构造:

线段树:4*空间
第一种:
#define maxn 100007//元素个数
int SegTree[maxn << 2];//线段树
// int lazy[maxn << 2];//延迟更新
int A[maxn];//原是数组第二种:结构体
void pushup(int rt) {//更新节点信息segtree[rt].val = segtree[rt << 1].val + segtree[rt << 1 | 1].val;//rt=左儿子+右儿子
}
void build(int l, int r, int rt) {if(l == r) {//叶节点segtree[rt].val = A[l];return ;}int m = (l + r) / 2;build(l, m, rt * 2);//左build(m + 1, r, rt * 2 + 1);//右pushup(rt);//回溯,向上更新
}

单点更新:

//单点更新:A[i] += x;
//准备修改的位置i,准备加上去的值x,节点区间l,r,存储下标为rt
void update(int i, int x, int l, int r, int rt) {//即查找然后修改if(l == r) {segtree[rt].val += x;return ;}int m = (l + r) >> 1;//改变某一个值,所以结果一定在某子树左边or右边if(i <= m) update(i, c, l, m, rt << 1);else update(i, c, m + 1, r, rt << 1 | 1);pushup(rt);
}

区间单点查询:

// 区间查询:
int query(int a, int b, int l, int r, int rt) {//a,b为查找区间,l,r为当前下标,rt为当前节点if(a <= l && r <= b) return segtree[rt].val;//包含if(a > r || b < l) return 0;//完全无关//接下来递归处理int m = (l + r) >> 1;//写法1:    // int ans = 0;// if(a <= m) ans += query(a, b, l, m, rt << 1);// if(b > m) ans += query(a, b, m + 1, r, rt << 1 | 1);// return ans;//写法2:return query(a, b, l, m, rt << 1) + query(a, b, m + 1, r, rt << 1 | 1);
}

区间更新:

//区间更新:会涉及到回溯(节点间关系改变),效率低,此时引入惰性标记
//惰性标记:记录更新(动态),查到哪里更新到哪里
#define  maxn 100007
int A[maxn];
struct segtreenode {int val, lazy;//惰性标记
}
segtree[maxn << 2];
//对应构造
void build(int l, int r, int rt) {segtree[rt].lazy = 0;if(l == r) {//叶节点segtree[rt].val = A[l];return ;}int m = (l + r) / 2;build(l, m, rt * 2);//左build(m + 1, r, rt * 2 + 1);//右pushup(rt);//回溯,向上更新
}

区间更新:

void pushdown(int rt, int ln, int rn) {//ln,rn为左右子树区间大小if(segtree[rt].lazy) {//下推标记//孩子继承父亲lazysegtree[rt << 1].lazy += segtree[rt].lazy;segtree[rt << 1 | 1].lazy += segtree[rt].lazy;//修改对应的值segtree[rt << 1].lazy += segtree[rt].lazy * ln;segtree[rt << 1 | 1].lazy += segtree[rt].lazy * rn;segtree[rt].lazy = 0;//清楚本节点标记}
}void update(int a, int b, int x, int l, int r, int rt) {if(a <= l && r <= b) {segtree[rt].val += x * (r - l + 1);//更新区间和segtree[rt].lazy += x;//根据操作为:累加or赋值return ;}int m = (l + r) >> 1;pushdown(rt, m - l + 1, r - m);//下推之后,才更新子节点if(a <= m) update(a, b, x, l, m, rt << 1);if(b > m) update(a, b, x, m + 1, r, rt << 1 | 1);pushup(rt);//更新本节点信息
}

区间(区间)查询:因存在惰性lazy,所以要处理lazy

通过下推,来让子节点信息准确


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/948023.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实用指南:2.CSS3.(2).html

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

「CTSC2017-游戏」题解

题解记录P3772 [CTSC2017] 游戏 sol 首先,由期望的线性性,把贡献拆到单点上,对每一场计算其胜利的概率即可。 首先已知的局可以不管,未知的局,显然只与其两侧最近的已知局有关。后面运用的一些概率表达在题面最下…

谢谢你周医生

谢谢你 周敏,张景     南京很美,想起你们我的心也很温暖

想让默认头像不再千篇一律,就顺手复刻了一下 GitHub 的思路

探索如何让默认头像不再千篇一律,我用 Go 复刻了 GitHub 风格的头像生成逻辑,根据输入生成独一无二的方块头像。文章分享了实现原理、效果展示以及未来扩展的思路在各种平台上,初始注册的用户通常都会被分配一个默认…

来源未知

点击查看代码 from PIL import Image# 定义字符集合 ascii_char = list("$@B%8&W#*oahkbdpqwmZO0QLCJYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`. ")def get_char(r, g, b, alpha=256):if a…

10.27(补)

继承和多态的动手动脑整理的word补上 链接:[https://files.cnblogs.com/files/blogs/847692/20243732张博学课后作业4.zip?t=1761562926&download=true]

vue3 vue3-form-element表单生成工具 输入框增加后缀

JSON schema数据{"title": "测试注册表单","description": "A simple form example.","type": "object","properties": {"firstName&quo…

java(3)基础规范

Java对大小写敏感。 关键字class的意思是类。JAVA是面向对象的语言,所有代码必须位于类里面。 编译后的源文件,得到相应的字节码文件,编译器为每个类生成独立的字节码文件。 main方法是JAVA应用程序的入口方法。格式…

袁天罡称骨歌的评骨格歌诀 - 木易

二两一钱:男:此命非业谓大凶,平生灾难事叠重,凶祸频临陷逆境,终世困苦事不成。女:生身此命运不通,乌云盖月黑朦胧,莫向故园载花木,可来幽地种青松。二两二:男:此命推来真气人,身寒骨冷若伶仃,劳劳碌碌虚度…

stm32F411RETx系列无CAN的处理思路

CAN 考虑到STM32F411RETX系列根本没有CAN,这该怎么办呢? 我在网上搜索到了一个解决方法: 使用一个独立的 CAN控制器芯片(如 MCP2515,这是最常用的选择),通过 SPI接口与 STM32通信。STM32 作为主机,通过 SPI协议…

Date 10.27

在 Print 之前 到现在还是想不明白为什么不骗那显眼的 80pts。 赛时 420/500pts,T5放了道紫。 A - 玩数字P.S. \(n \le 10^{15}\) 唐题,可以 \(O(\sqrt n)\) 解决,中间进行数位分离即可,当然你也可以打表。 Code #…

20232402 2025-2026-1 《网络与系统攻防技术》实验三实验报告

1.实验内容 1.1 基础免杀技术测试​ (1)msfvenom 编码器免杀: 生成未编码与多次编码的反向连接恶意程序,分别复制到靶机,对比杀软拦截情况,验证编码器对特征码的混淆效果;​ (2)Veil 工具免杀: 通过 Veil 生…

读书日记3

6到10章深入探讨了编程中最基础的元素——变量和数据类型,让我看到了平凡中的非凡。 核心收获与深刻见解: 1.变量命名的艺术性:McConnell详细阐述了优秀变量名的特征——表达"什么"而不是"如何"…

2025年多商户商城代理招募加盟/多商户项目合伙人加盟最新推荐榜:多商户兼职项目合伙人/B2B2C商城代理招募公司/聚焦项目孵化与商户扶持能力深度解析

随着大众创业热潮持续升温,以及数字化商业模式的快速迭代,创业者在选择项目合作方时常常面临多重考量 —— 如何辨别企业项目的可行性、如何匹配自身资源的合作模式、如何降低创业初期的运营风险,成为当下创业者关注…

20232420 2025-2026-1 《网络与系统攻防技术》实验三实验报告

1.实验内容学会使用msf编码器,veil-evasion,利用shellcode编程,加壳等免杀工具或技巧。尝试实现恶意代码免杀。理解免杀机制和原理,认识到杀软局限性。2.实验过程 2.1 免杀效果参考基准 2.1.1 免杀效果的评价 用Vi…

掘金2025年:数字化商业浪潮下,如何选对平台与伙伴?一站式多商户商城系统推荐榜发布,多商户商城代理招募/多商户项目合伙人加盟/一站式开店代理项目加盟

随着数字化转型深入各行各业,个体创业与企业多渠道拓展需求激增,能够整合资源、快速部署、共享收益的多商户商城模式已成为市场新蓝海。2025年,预计相关平台与服务市场规模将持续扩大,但市场中项目质量、技术支撑与…

Tuack 生成 OI 比赛题目 PDF 笔记

一些关于 Tuack 生成 OI 比赛题目 PDF 的笔记Part 1. Tuack 的基本介绍 Tuack,是一个由来自 THU 的大佬 Mulab11 开发的,用于造算法竞赛题目的工具。 你可以用它:导出 PDF、Markdown、HTML 等多种不同格式,NOI、CP…

为医疗器械行业搭建“数字桥梁”,破解协同效率与合规难题

当传统沟通方式成为行业发展瓶颈,数字化协同正重塑医疗器械供应链的竞争力格局。当传统沟通方式成为行业发展瓶颈,数字化协同正重塑医疗器械供应链的竞争力格局。 “每天在微信、QQ群里有上百条沟通,订单、发货、发…

# 20232312 2025-2026-1 《网络与系统攻防技术》实验三实验报告

1.实验内容 1.1本周学习内容Metasploit 框架使用C语言编程与Shellcode集成跨平台编译技术加壳与免杀技术1.2回答问题 1.2.1杀毒软件如何检测恶意代码? 杀毒软件采用多种技术手段综合判断,主要方法包括:特征码检测原…

PostgreSQL 服务版

PostgreSQL 二进制下载地址 https://www.enterprisedb.com/download-postgresql-binaries尽量使用管理员权限 开始步骤 1.找到下载的目录,我这里使用的是版本18 C:\Users\Administrator\Downloads\pgsql 解压后会得到…