洛谷题单指南-二叉堆与树状数组-P3374 【模板】树状数组 1

news/2024/11/18 11:24:22/文章来源:https://www.cnblogs.com/jcwy/p/18543218

原题链接:https://www.luogu.com.cn/problem/P3374

题意解读:树状数组模版:单点修改,区间求值。

解题思路:

树状数组-Binary Index Tree可以动态维护一组数,可以O(logn)的修改一个数,也可以O(logn)的计算一段区间的和。

思考一下朴素做法:如何修改一个数,计算区间和?

如果是常规数组,修改操作是O(1),计算区间和需要先计算前缀和,复杂度为O(n)

如果是前缀和数组,修改操作是O(n),计算区间和是O(1)

如果数据变更m次,总的复杂度将达到m*n

而树状数组可以使得两种操作的复杂度都是O(logn)。

1、树状数组定义

原数组:a[i]表示第i个数,

树状数组:tr[i]表示从i往前lowbit(i)个数的和,

lowbit(i)的含义是取整数i的最后一个二进制1所代表的整数,如i = 12,对应二进制1100,lowbit(i) = 4,

在c++中lowbit(i)的计算可以用i & -i。

2、利用树状数组求区间和

设s[x]为a[1]~a[x]的前缀和,根据tr[]的定义可知:

int sum(int x)

{

  for(int i = x; i > 0; i -= lowbit(i)) s[x] += tr[i];

}

i减lowbit(i)最多持续logn次,所以计算前缀和的复杂度为O(logn)

有了前缀和,l~r的区间和就很容易求得:s[r] - s[l-1]

3、利用树状数组修改元数组的值

上图形式化表示a,tr的关系:

如tr[8]表示以a[8]往前lowbit(8)=8长度的a的元素之和,tr[12]表示以a[12]往前lowbit(12)=4长度的a的元素之和。

tr[16] = a[16] + tr[15] + tr[14] + tr[12] + tr[8]

tr[12] = a[12] + tr[11] 

tr[10] = a[10] + tr[9]

如此构成了一种树形关系,因此称为树状数组。

当要修改一个a元素的值a[x],关键问题在于要同时跟新与a[x]有关的若干个tr值

比如修改了a[11],显然在树中往根节点回溯即可找到所有受a[11]影响的tr值:tr[11]、tr[12]、tr[16]

11的二进制1011,12的二进制1100,16的二进制10000

它们的关系为:1011 + lowbit(1011) = 1100 ,1100 + lowbit(1100) = 10000

因此当修改一个a[x] += val,其所能影响的所有tr如下:

void add(int x, int val)

{

  for(int i = x; i <= n; i += lowbit(i)) tr[i] += val;

}

4、树状数组初始化

有两种初始化方法:

O(n * logn): 利用给元素增加值的函数,对于每一个a[i],都add(i, a[i])

O(n): 先求a的前缀和s,对于tr[i] = s[i] - s[i - lowbit(i) + 1]

100分代码:

 

#include <bits/stdc++.h>
using namespace std;const int N = 500005;
int n, m;
int tr[N];int lowbit(int x)
{return x & -x;
}void add(int x, int val)
{for(int i = x; i <= n; i += lowbit(i)) tr[i] += val;
}int sum(int x)
{int res = 0;for(int i = x; i != 0; i -= lowbit(i)) res += tr[i];return res;
}int main()
{cin >> n >> m;int a;for(int i = 1; i <= n; i++) {cin >> a;add(i, a);}int op, x, y;while(m--){cin >> op >> x >> y;if(op == 1) add(x, y);else if(op == 2) cout << sum(y) - sum(x - 1) << endl;}return 0;
}

 

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

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

相关文章

11月16日,工信部人才交流中心 CUUG - PGCP / PGCM认证考试完成!

2024年11月16日,由工业和信息化部人才交流中心 与 北京神脑资讯技术有限公司共同举办的PostgreSQL管理员岗位能力认证考试(PGCP中级/PGCM高级)完成。 中级PG认证专家-PGCP(PostgreSQL Certified Professional):是对PostgreSQL数据库技术能力的一种认可,达到了专家级别,…

manim边做边学--球体

Sphere类用于创建三维球体对象,它提供了丰富的参数和方法来定制球体的外观和行为。 球体在制作三维动画时,具有广泛的应用场景。 比如:展示几何概念:通过创建不同大小、颜色和透明度的球体,可以直观地展示几何中的体积、表面积等概念 物理模拟:在模拟物理现象(如重力、碰…

闵可夫斯基和

闵可夫斯基和 前言 部分图片来自 https://www.luogu.com.cn/article/mhp0aeub。 定义 对于两个向量集合 \(A,B\),它们的闵可夫斯基和为 \(\{ a+b | a \in A, b \in B\}\)。 求解 在 OI 中,我们一般研究凸包的闵可夫斯基和。 如图是两个凸包的闵可夫斯基和。本文来自博客园,作…

UNIAPP设置消息推送(v1.0),自定义铃声功能

目前项目需要开发一个物联网APP进行设备绑定、警情查看、统计分析、设备操作、自定义报警铃声等相关功能 采用的uniapp进行开发,功能其实都很简单就是调用SDK进行设备关联、数据的增删改查,逻辑清晰明了,没想到问题出在了消息推送这块, 消息推送-因为是uniapp进行开发所以采…

仓储和运输如何协同?项目管理在物流行业的应用

物流运输是现代经济的核心,覆盖了供应链的多个环节,从订单接收到仓储管理,再到运输配送,每一步都关系到效率和成本。然而,物流行业的复杂性也带来了管理难题,例如多部门协作不畅、运输计划不可控、资源分配不合理等。面对这些挑战,项目管理工具正逐步成为提升物流运输效…

6、oracle网络(监听)

oracle包含 1、软件 2、数据库 3、实例 4、监听(listener) 监听的特点 可以独立启动,就是说,数据库没有启动,监听可以启动;数据库启动,监听也可以不启动;数据库启动,监听也启动 监听和数据库是独立分开的数据库的整个网络结构图解: 1、数据库有数据库的名字:dbname;…

inline-block元素下移问题的分析及解决

不知道大家有没有遇到过这种蛋疼的情况,当你排列了三个 display 属性为inline-block的 div 时。我们在其中一个div中输入文字,就会出现如下这种现象,设置文字 div 的布局变化了。问题定位 为什么会出现这种情况呢?我们打开控制台查看一下元素布局,如下图我们能看到第二个 …

NOIP 模拟赛:2024-11-16

全体栽在 T1 ? T1:二分一下内存大小然后模拟判断。关键点在于意识到 "解码" 和 "播放" 这两种事件是分开的。用一个 while 循环,每次循环从 "完成某帧的解码"、"开始某帧的解码"、"播放某帧"、"删除某帧" 之间…

什么是员工绩效管理系统?员工绩效管理系统怎么用?

我们都知道,面对大环境激烈的竞争,企业在运作工程中,员工绩效管理系统有着至关重要的地位。它与员工个人的职业发展和工作成果息息相关,更是企业实现战略目标、在激烈竞争中崭露头角的关键所在。 不少企业在实施绩效管理系统时遇到了不少麻烦,但是他们建立了完善的绩效管理…

5、oracle内存及进程操作讲解

内存结构 1、shared pool 缓存着sql、sql执行计划 查询shared pool大小: select * from v$sga_dynamic_components;2、buffer cache 缓存着数据文件里面的block 查看buffer cache里面的buffer: select * from v$bh;一行一个buffer buffer里面有一个字段:TCH 用户登录上数据库…

为什么需要[EnumeratorCancellation]?

在编写 async IAsyncEnumerable为什么需要 [EnumeratorCancellation]? 在使用 C# 编写异步迭代器时,您可能会遇到如下警告: warning CS8425: 异步迭代器“TestConversationService.ChatStreamed(IReadOnlyList<ChatMessage>, ChatCompletionOptions, CancellationToke…

解决MindSpore-2.4-GPU版本的安装问题

本文介绍了在Ubuntu-20.04系统下安装最新的MindSpore-2.4-for-GPU版本的方法,以及安装过程中有可能出现的一些问题。虽然在MindSpore的正式版本中已经不再支持GPU硬件后端,但是开发版本目前还是持续在支持的,并且其中包含了2.3和2.4版本的新特性,只是算子层面没有更新和优化…