关于pushup与pushdown的几种常见情况

news/2025/3/11 8:53:01/文章来源:https://www.cnblogs.com/2026zhaoyl/p/18689613

适用于线段树、平衡树等树形结构

一.区间修改,区间求和(求最值)

二.最大连续子序列

这里有一种类似于 \(DP\) 的方法。

对于一个节点 \(Rt\),我们需要维护四个值。

  • \(sum\) : 此区间的总和。
  • \(lmx\) : 此区间从左边开头的最大连续子序列。
  • \(rmx\) : 此区间从右边开头的最大连续子序列。
  • \(mx\) : 此区间的最大连续子序列。

想想怎么从两个儿子更改父亲节点的值。

如下图。

image

备注:① 代表 \(Rt\) 左儿子的 \(lmx\),② 代表 \(Rt\) 左儿子的 \(rmx\),⑤ 代表 \(Rt\) 左儿子的 \(sum\)。③、④、⑥ 同理。

1. \(Rt\)\(sum\)

很简单,左右儿子 \(sum\) 的和加上此节点的值即可。

code :
rt->sum = rt->ch[0]->sum + rt->ch[1]->sum + rt->val;
2. \(Rt\)\(lmx\)

首先,合并左右儿子的区间后,\(Rt\)\(lmx\) 可以为左儿子的 \(lmx\),即 ① 这一段。
其次,\(Rt\)\(lmx\) 也可以由左儿子的总和、此节点的值与右儿子的 \(lmx\) 的和,即 ⑤ 与 ③ 这两段的和。
两者取最大即可。

code :
rt->lmx = max(rt->ch[0]->lmx, rt->ch[0]->sum + rt->ch[1]->lmx + rt->val);
3. \(Rt\)\(rmx\)

\(lmx\) 类似的。
首先,\(Rt\)\(rmx\) 可以为左儿子的 \(rmx\),即 ④ 这一段。
其次,\(Rt\)\(rmx\) 也可以由右儿子的总和、此节点的值与左儿子的 \(rmx\) 的和,即 ⑥ 与 ② 这两段的和。
同样取较大者。

code :
rt->rmx = max(rt->ch[1]->rmx, rt->ch[1]->sum + rt->ch[0]->rmx + rt->val);
4. \(Rt\)\(mx\)

最后,\(Rt\)\(mx\) 有三种取值。

  • \(Rt\) 左儿子的 \(mx\)
  • \(Rt\) 右儿子的 \(mx\)
  • \(Rt\) 左儿子的 \(rmx\)、此节点的值与右儿子的 \(lmx\) 之和,即 ② + ③。
code :
rt->mx = max({rt->ch[0]->mx, rt->ch[1]->mx, rt->ch[0]->rmx + rt->ch[1]->lmx + rt->val});

最后代码如下:

Code :

inline void pushup(node* &rt) {if (rt == NIL) return ;rt->siz = rt->ch[0]->siz + rt->ch[1]->siz + 1;rt->sum = rt->ch[0]->sum + rt->ch[1]->sum + rt->val;rt->lmx = max(rt->ch[0]->lmx, rt->ch[0]->sum + rt->ch[1]->lmx + rt->val);rt->rmx = max(rt->ch[1]->rmx, rt->ch[1]->sum + rt->ch[0]->rmx + rt->val);rt->mx = max({rt->ch[0]->mx, rt->ch[1]->mx, rt->ch[0]->rmx + rt->ch[1]->lmx + rt->val});
}

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

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

相关文章

美团门票度假商家新订单短信微信邮件提醒

美团门票度假商家新订单目前没有短信微信邮件提醒功能,因此就开发了一个售卖

TextMeshPro系列 —— TextMeshPro (UGUI)

TextMeshPro (UGUI) 默认情况下,TextMesh Pro UI Text 游戏对象包含以下组件:Rect Transform:控制游戏对象在画布上的位置和大小。 Canvas Renderer:在画布上渲染游戏对象。 TextMesh Pro UGUI:包含要显示的文本,以及控制其外观和行为的属性。 Material:一个 Unity 材质…

【运维】运维自动化:工程师的“终结者”还是“助推器”?

一、 运维自动化来袭,行业震荡初现 在当今数字化浪潮中,运维自动化的迅猛发展正深刻变革着整个行业。从简单脚本执行到复杂系统智能管控,自动化工具与技术如雨后春笋般涌现,正重塑着运维工作的格局。 众多企业已大规模引入自动化运维体系,借助 Ansible、Puppet 等工具实现…

cyi启航杯wp

💩杯web Easy_include我用data伪协议 ?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs=然后看源代码就有了QHCTF{008110b0-0ea4-4ff3-b02e-bd9e74f1be44}Web_IP flag.php有 Your IP is : xxx.... 原本以为X-Forwarded-For就行,后面发现X-Forwarde…

desmos指北

官方网站 还在学\(OI\)的可以关闭了,给\(whk\)的同学看的 你可能需要了解一些\(LaTeX\),以及数学知识 下标_如\(a_1\),上标^,如\(a^b\) 功能举例具体教程(其实没啥用,官网给的很详细) 试用案例 ✍️ 用 Desmos 3D 制作正方体,相关命令记录; 法1:在输入栏依次手动输入,不…

从理论到实践:Scrum Master(CSM)课程助你成为敏捷引领者

Scrum Master(CSM)在敏捷开发的广阔天地里,Scrum作为最具影响力的框架之一,帮助团队提升协作效率和交付速度。而作为Scrum团队的核心人物,Scrum Master(CSM)无疑是敏捷成功的关键推动者。获得CSM认证,意味着不仅了解Scrum框架,更能有效领导团队走向更高效的工作方式。…

Chat2DB:一款开源的智能数据库查询工具

Chat2DB是一款AI first的数据管理、开发、分析工具,可以将自然语言转换为SQL,也可以将SQL转换为自然语言。 https://chat2db-ai.com/ 以下文章来源于小华同学ai ,作者小华 Chat2DB是一款开源的智能数据库查询工具,旨在帮助开发者更高效地与数据库进行交互。通过自然语言处理…

【Atcoder训练记录】AtCoder Beginner Contest 390

训练情况赛后反思 A题犯蠢冒泡排序写错,B题等比数列不能使用除法算公比,会有误差问题,成比例要用乘法比较 A题 我们观察到 12345 是有序的,所以我们对于给出的数列进行冒泡排序,次数为 1 次答案就为 YES 否则为 NO点击查看代码 #include <bits/stdc++.h> // #define…

【Linux文件】如何在 Linux 上查找占用空间较大的文件和文件夹【测试成功】

在日常使用 Linux 的过程中,我们常常需要清理磁盘空间。找出占用空间较大的文件和文件夹是一个重要的步骤。 本文将介绍几种方法来查找这些占用空间较大的文件和文件夹。 方法一:使用 du 和 sort 命令 这种方法结合了 du 和 sort 命令,可以快速找到当前目录及其子目录中占用…

RocketMQ原理—4.消息读写的性能优化

大纲 1.Producer基于队列的消息分发机制 2.Producer基于Hash的有序消息分发 3.Broker如何实现高并发消息数据写入 4.RocketMQ读写队列的运作原理分析 5.Consumer拉取消息的流程原理分析 6.ConsumeQueue的随机位置读取需求分析 7.ConsumeQueue的物理存储结构设计 8.ConsumeQueue…

【蓝桥训练记录】第 25 场 蓝桥月赛

训练情况赛后反思 几场比赛一起开导致不会做简单题了,CD感觉都不难 A题 蛇有十一画,直接输出 11点击查看代码 #include <iostream> using namespace std; int main() {cout<<11;return 0; }B题 我们发现无论是长宽除二,面积也会除二,但是这题除二的前提条件是为…

TensorFlow2入门与实践--CNN

使用TensorFlow高级API搭建卷积神经网络并进行图片分类实践。卷积神经网络CNN CNN原理 关于CNN的原理本文使用代码的方式来直观理解卷积中各个操作过程。 卷积 卷积层是CNN的核心组件,通过可学习的卷积核在输入特征图上进行滑动窗口操作。每个位置上,卷积核与输入进行逐元素乘…