关于树状数组的一些东西

本来以为背背板子就够用了的,发现有的时候会需要其中的一些东西。

原来树状数组也有自己的不可替代性。

但是像用树状数组做平衡树这种我确确实实不感兴趣。

当摸鱼写一些吧。

个人认为,树状数组是最能体现 OI 魅力的数据结构,它集简洁,巧妙,智慧与一身,我非常喜欢。

这个是记录向的,并不是教学向的,就是闲得没事瞎写的。

lowbit 函数

如果想要真正理解树状数组,我们需要说说这个用途不仅仅限于树状数组,还有假壮压骗分等等用途的 lowbit。

lowbit(x) 表示的是 x 在二进制表示下最低位的 1 和后边的所有 0 组成的数值。

通过这个我们可以快速锁定最低位的 1 并简单的进行这个最低位 1 的删除,而且这个东西是可以快速求解的。

来说一下我们通常遇见的形式是怎么来的。

我们设一个数二进制表示下第 k 位是 1, 0~k-1 位都是0。

先把这个数字取反,这个时候 0~k-1 的这一堆 0 就变成了 1, 第 k 位就变成了 0,这个时候我们再加一,前边的一堆 1 都会变成 0,最终这个进位的过程停止在 k 的位置,由于取反现在前边的位置都是恰好相反的,这个时候我们与原来的数字进行按位与就好了。

补码之下,取反 x 表示为 -1-x。

所以我们得到了最常见的形式:lowbit(x)=x&(-x);

非常的优美。

一维树状数组

这里涉及单点修改区间查询,区间修改单点查询,区间修改区间查询。

我们以最基本的单点修改区间查询做例子。

单点修改,区间查询

先给一张蓝书的图片吧,这个就是我们的树状数组的样子了。

注意是别人的图,我觉得这个图片棒极了,偷偷贴一下。

在树状数组中,\(tr[i]\) 表示区间 \([i-lowbit(i)+1,x]\) 中的信息并。

以下我们以动态维护单点加减一个数字,区间求和为例子。

这个信息并自然就是区间的和。

先考虑区间求和,先假定左端点是 1。

我们发现区间的左右端点都是数字(废话)。

而众所周知,一个数字是可以被二进制分解的(废话*2)。

所以我们就可以通过二进制分解把这个东西搞成 \(log n\) 段,我们便可以将其对应在树状数组的各段上边。

比如说我们要求 \([1,6]\) 的和,6 的二进制是 110, 我们就可以将其分解成 110 段和 100 段,对应了树状数组的 4 和 6,我们在图上可以明显感受到这一点。

每一次跳段我们使用 lowbit 函数就行了。

我们发现这个不会大于 \(log\) 次的,跳的次数永远是二进制表示下 1 的数量,这也是树状数组速度极端优秀的根本原因。

如果左端点不是一我们就做差就行了,[a,b]=[1,a-1]-[1,b] 这个样子把答案差分出来就行了。

但这种查询方式让我们只能直接维护可以被差分的信息,大大减少了这个东西的泛用性,比如不能直接维护区间最值(其实可以,但是比较复杂,我不会)。

至于单点的修改,我们发现改一个点只会影响到覆盖自己的点,我们就不停加自己的 lowbit 就行了,把每个祖先加上自己的值,这个明显也是 log 级别的。

区间修改,单点查询

我们使用差分就行了,很简单,这里不解释差分了。

依然以加法为例子。

我们把 \([a,b]\) 的加 val 转化为差分数组中的 d[a] 加上 val,d[b+1] 减去 val 就成为了之前的问题。

求一个点的值自然就是求差分数组的前缀和。

就没了。

区间修改,区间查询

我们还是利用前缀和与差分的知识。

我们把区间求和用差分数组列出来,默认从 1 开始了,如上原因,都一样的。

\(\sum_{x}^{i=1}\sum_{j=1}^{i}d[j]\)

这个玩意难优化,我们考虑每一个 d[j] 出现了多少次,对于一个 j 自然是出现了 (x-j+1) 次的,我们直接改为枚举 d[j],通过出现次数来计算,就成了如下形式。

\(\sum_{j=1}^{x}(x-j+1)d[j]\)

我们发现这样子依然是十分甚至九分的低效,于是我们开始拆开式子。

\((x+1)\sum_{j=1}^{x}d[j]-\sum_{j=1}^{x}j\times d[j]\)

我们使用两个树状数组分别维护 d[j] 和 d[j]* j 的前缀和就好了。

经典的应用

  • 逆序对

  • 优化一些过程

  • 维护最后的 1

二维树状数组

也是一样的,只不过我们多了一维。

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

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

相关文章

完整教程:量子机器学习深度探索:从原理到实践的全面指南

完整教程:量子机器学习深度探索:从原理到实践的全面指南2025-10-02 15:13 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important…

[问题记录] vmagent 增加 aggregation 表达式后,CPU 上升 2.43 倍, 内存上升 3.82 倍

[问题记录] vmagent 增加 aggregation 表达式后,CPU 上升 2.43 倍, 内存上升 3.82 倍作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!cnblogs博客 zhihu Github 公众号:一本正经的瞎扯在这篇文章:「Vic…

济南做网站的中企一键logo设计app

题目 输入一个树状天平,根据力矩相等原则判断是否平衡。如图6-5所示,所谓力矩相等,就是WlDlWrDr,其中Wl和Wr分别为左右两边砝码的重量,D为距离。采用递归(先序)方式输入:每个天平的…

lazyVIM整体介绍、常用功能和插件

LazyVim 是一个基于 Neovim + Lazy.nvim 插件管理器 构建的现代化、模块化、开箱即用的 Neovim 配置框架。它极大降低了 Neovim 的使用门槛,同时保留了高度可定制性。 下面为你详细介绍 LazyVim 中的常用插件和核心功…

广州建站公司网站图片设计在线

正则表达式匹配的是文本内容,linux的文本三剑客 都是针对文本内容 grep 过滤文本内容 sed 针对文本内容进行增删改查 awk 按行取列 文本三剑客都是按行进行匹配。 grep grep 的作用就是使用正则表达式来匹配文本内容 选项: -m …

云校网站建设上海网址一360导航

对之前文章的补充:MyBatis中的#{}与${}注入问题----原文链接 前言: MyBatis是一个流行的Java持久层框架,用于将对象与数据库中的数据进行映射。然而,如果不当使用,MyBatis也可能受到诸如SQL注入这类的安全问题的影响。…

vue网站开发教程设计师用什么软件设计效果图

本文使用 Zhihu On VSCode 创作并发布跨时钟域同步(异步FIFO)之前学习了跨时钟域下的单bit信号同步的方法,这些单bit信号多是作为控制信号或者标志信号来使用,再实际的项目中,处理多bit数据也是十分常见的,…

互联网项目各阶段素材驱动与AI技术的深度运用策略

互联网项目各阶段素材驱动与AI技术的深度运用策略pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas",…

【SpringAI】第四弹:深入解析 Rag 检索增强工作流程、最佳实践和调优 - 详解

【SpringAI】第四弹:深入解析 Rag 检索增强工作流程、最佳实践和调优 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fam…

2025 年浮动密封厂家 TOP 企业品牌推荐排行榜,矿用,工程机械,矿山机械,煤矿井下,煤矿机械浮动密封推荐这十家公司!

在工业领域,浮动密封的重要性不言而喻,其性能优劣直接关乎设备的运行稳定性、使用寿命及生产效率。然而,当前浮动密封市场鱼龙混杂,产品质量参差不齐。部分厂家工艺落后,导致密封效果不佳,频繁出现泄漏问题,不仅…

P2141 [NOIP 2014 普及组] 珠心算测验

简易题解 题目大意 给定一个包含 \(n\) 个互不相同的正整数的集合。我们需要找出这个集合中有多少个数字,恰好等于集合中另外两个不同数字的和。 思路分析 题目要求我们找出满足 A = B + C 形式的数字 A,其中 A, B, …

CF1081F Tricky Interactor

比较狗蛋的题目。 首先发现随机,一般这种随机题次数也是随机的。 然后发现操作的性质,每两次操作要么不变,要么除了这个区间内的数都翻转,然后我们每次查询 \([i, i]\),先用 \(4\) 次操作将它查出来,再用 \(4\) …

2025.10 做题笔记

MAO!MAO! GIVE ME LOVE 君 gimmick gimmick LOVE どうか笑ってダーリン MAO! GIVE ME LOVE 君 gimmick gimmick LOVE 今夜最後まで 鳴らせ——洛天依《MAO!》AT_arc121_e 思维难度:\(\color{#FFC116} 黄\) *1500 这也…

2025年浮动油封厂家TOP企业品牌推荐排行榜,深度剖析技术创新与产品性能矿用,工程机械,矿山机械,煤矿井下,煤矿机械油封推荐这十家公司!

在煤矿井下机械、矿山机械、硬岩盾构机等恶劣工况设备运行中,浮动油封的性能至关重要,它直接影响设备的使用寿命与运行稳定性。当前市场上浮动油封品牌众多,质量与性能参差不齐,给企业选购带来极大困扰。为帮助企业…

加盟企业网站建设目的wordpress小工具音乐

1. 前言 上篇文章,我们已经将人像分割的ncnn-android-yolov8-seg项目运行起来了,后续文章我们会抽取出Demo中的核心代码,在自己的项目中,来接入人体识别和人像分割功能。 先来看下效果,整个图像的是相机的原图&#…

秦皇岛网站制作微商城建设邀请专家集体会诊网站建设

Authorization 对于很多应用,出于安全考虑我们的接口并不希望对外公开。这个时候就需要使用授权(Authorization)机制。 授权过程验证您是否具有访问服务器所需数据的权限。 当发送请求时,通常必须包含参数,以确保请求具有访问和返回所需数据…

0.机器人的URDF文件修改

0.URDF简介 URDF全称(United Robotics Description Format)统一机器人描述格式,是一个XML语法框架下用来描述机器人的语言格式。URDF文件可以导入ROS或者Matlab进行仿真,但是事实不一定只能使用URDF,在Isaac gym …

网站怎么看是什么程序做的换服务器wordpress升级

接上篇,根据脚本可将coco128的128张图片,按照比例划分成训练集、测试集、验证集,同时生成相应的标注的labels文件夹,最近再看实例分离比较火的mask rcnn模型,准备进行调试但由于实验室算力不足,网上自己租的…

中小企业网站建设 论文旅游景区网站建设规划

文章目录 前言一、cubemx配置二、代码1.引入库bsp_hal_ps2.cbsp_hal_ps2.h 2.主函数 前言 本文讲解使用cubemx配置PS2手柄实现对手柄的按键和模拟值的读取。 很简单,库已经封装好了,直接就可以了。 文件 一、cubemx配置 这个很简单,不需要…

task1_1.c

include <stdio.h> int main() { printf(" o \n"); printf("\n"); printf("I I\n"); printf(" o \n"); printf("\n"); printf("I I\n"); return 0…