P3374 【模板】树状数组 1 浅谈树状数组 (内附封面)

news2025/1/10 1:56:42

【模板】树状数组 1

题目描述

如题,已知一个数列,你需要进行下面两种操作:

  • 将某一个数加上 x x x

  • 求出某区间每一个数的和

输入格式

第一行包含两个正整数 n , m n,m n,m,分别表示该数列数字的个数和操作的总个数。

第二行包含 n n n 个用空格分隔的整数,其中第 i i i 个数字表示数列第 i i i 项的初始值。

接下来 m m m 行每行包含 3 3 3 个整数,表示一个操作,具体如下:

  • 1 x k 含义:将第 x x x 个数加上 k k k

  • 2 x y 含义:输出区间 [ x , y ] [x,y] [x,y] 内每个数的和

输出格式

输出包含若干行整数,即为所有操作 2 2 2 的结果。

样例 #1

样例输入 #1

5 5
1 5 4 2 3
1 1 3
2 2 5
1 3 -1
1 4 2
2 1 4

样例输出 #1

14
16

提示

【数据范围】

对于 30 % 30\% 30% 的数据, 1 ≤ n ≤ 8 1 \le n \le 8 1n8 1 ≤ m ≤ 10 1\le m \le 10 1m10
对于 70 % 70\% 70% 的数据, 1 ≤ n , m ≤ 1 0 4 1\le n,m \le 10^4 1n,m104
对于 100 % 100\% 100% 的数据, 1 ≤ n , m ≤ 5 × 1 0 5 1\le n,m \le 5\times 10^5 1n,m5×105

数据保证对于任意时刻, a a a 的任意子区间(包括长度为 1 1 1 n n n 的子区间)和均在 [ − 2 31 , 2 31 ) [-2^{31}, 2^{31}) [231,231) 范围内。

样例说明:

故输出结果14、16

什么是树状数组?

  • 树状数组用的是树结构的思想(也就是树型逻辑结构),而不是真正的“树形结构”
  • 具体实现原理如下图
    在这里插入图片描述

在这里插入图片描述

  • 而为了实现这样的效果,我们需要一个神奇的二进制转化
    l o w b i t ( x ) lowbit(x) lowbit(x)
    lowbit 为一个数的二进制表示中最右边 11 所对应的值
    或者说:
    l o w b i t = 2 k lowbit=2^k lowbit=2k
    ,k为一个数的二进制表示中末尾0的个数
    但实际上还有一种更为简单粗暴的写法
    x & − x x \&-x x&x
    代码实现为
int lowbit(int x){
   return x&-x; 
}

初始化

树状数组的输入也很简单,只需要add( i , a )即可

for(int i=1;i<=n;i++){
		int lk;
		cin>>lk;
		T1.add(i,lk);
	}

单点修改

想要实现在x位置加上ad,在需要修改的部分如图中红线所示
在这里插入图片描述

由此我们可以得到以下代码

void add(int x,int ad){
		while(x<=n){
			tr[x]+=ad;
			x+=lowbit(x);
		}
	}

区间查询

树状数组是无法实现直接的区间查询的,它是通过前缀和加减的形式求出的区间和,代码实现如下

int query(int x){
		int ans=0;
		while(x){
			ans+=tr[x];
			x-=lowbit(x);
		}
		return ans;
	}

就这么简单,没了,线段树你*************

能力有限讲的可能并不清楚www

结构体封装

对于树状数组,我们可以把它封装在一个结构体内,代码实现如下

struct bit_tree{
	int tr[N];
	void add(int x,int ad){
		while(x<=n){
			tr[x]+=ad;
			x+=lowbit(x);
		}
	}
	int query(int x){
		int ans=0;
		while(x){
			ans+=tr[x];
			x-=lowbit(x);
		}
		return ans;
	}
}t1;

当然,写函数也是可行的,二者均可

AC CODE

#include<bits/stdc++.h>
using namespace std;
#define int long long int
const int N=1e6+233;
int n,m,a[N];
int lowbit(int x){
	return x&-x; 
}
struct bit_tree{
	int t[N];
	void add(int x,int ad){
		while(x<=n){
			t[x]+=ad;
			x+=lowbit(x);
		}
	}
	int query(int x){
		int ans=0;
		while(x>0){
			ans+=t[x];
			x-=lowbit(x);
		}
		return ans;
	}
}T1;
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		int lk;
		cin>>lk;
		T1.add(i,lk);
	}
	while(m--){
		int op,xx,yy,kk;
		cin>>op;
		if(op==1){
			cin>>xx>>kk;
			T1.add(xx,kk);
		}
		if(op==2){
			cin>>xx>>yy;
			int ans=T1.query(yy)-T1.query(xx-1);
			cout<<ans<<endl;
		}
	}
	return 0;
}

附封面(屑魔女)

请添加图片描述

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

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

相关文章

部署安装私服-Gitlab

一、国内的gitlab是极狐 www.gitlab.cn 国服 www.github.com 国际服 二、国服的gitlab蛮适合中国国情的 1.提交申请可以获得30天的订阅版服务&#xff0c;有需要的话可以先提交一下。订阅后功能多一些。 Gitlab中文官网下载_GitLab免费下载安装_极狐GitLab免…

从零开始学python(十四)百万高性能框架scrapy框架

前言 回顾之前讲述了python语法编程 必修入门基础和网络编程&#xff0c;多线程/多进程/协程等方面的内容&#xff0c;后续讲到了数据库编程篇MySQL&#xff0c;Redis&#xff0c;MongoDB篇&#xff0c;和机器学习&#xff0c;全栈开发&#xff0c;数据分析&#xff0c;爬虫数…

uniapp 视频截图

uniapp 视频截图 本文只针对微信小程序&#xff0c;其他平台并没有测试过&#xff0c;不确定可行性。 微信提供了两个组件可以用来播放视频&#xff1a; live-player: 只要用于实时音视频的播放&#xff08;出于政策和合规的考虑&#xff0c;微信暂时没有放开所有小程序对&l…

地统计学空间插值方法及应用

地统计学 地统计学&#xff0c;是指以具有空间分布特点的区域化变量理论为基础&#xff0c;研究自然现象的空间变异与空间结构的一门学科。它是针对像矿产、资源、生物群落、地貌等有着特定的地域分布特征而发展的统计学。由于最先在地学领域应用&#xff0c;故称地统计学 地…

自学网络安全(黑客)学习心得路线规划

趁着今天下班&#xff0c;我花了几个小时整理了下&#xff0c;非常不易&#xff0c;希望大家可以点赞收藏支持一波&#xff0c;谢谢。 我的经历&#xff1a; 我 19 年毕业&#xff0c;大学专业是物联网工程&#xff0c;我相信很多人在象牙塔里都很迷茫&#xff0c;到了大三大…

html | 无js二级菜单

1. 效果图 2. 代码 <meta charset"utf-8"><style> .hiddentitle{display:none;}nav ul{list-style-type: none;background-color: #001f3f;overflow:hidden; /* 父标签加这个&#xff0c;防止有浮动子元素时&#xff0c;该标签失去高度*/margin: 0;padd…

4年测试工程师,常用功能测试点总结,“我“不再走弯路...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 输入框测试 1、字…

模电专题-MOS管的放大电路分析

在实际应用中&#xff0c;我们经常会使用到功率MOS&#xff0c;这时通常不会将它当成一个开关使用&#xff0c;而是当成一个放大器来使用&#xff0c;那这就需要让其工作在放大状态。 参考下图中的mos管的特性曲线&#xff0c;右图中的输出特性曲线中有一根红色的分界线&#x…

2000-2021年上市公司常用控制变量数据(A股)含stata处理代码

2000-2021年上市公司企业A股常用控制变量 1、时间&#xff1a;2000-2021年&#xff08;注&#xff1a;股权性质从2004年开始&#xff0c;第一大股东持股比例从2003年开始&#xff09; 2、来源&#xff1a;整理自csmar 和wind 3、数据范围&#xff1a;A股公司 不包含已退市的…

使用Python动画粒子的薛定谔波函数(ψ)(完整代码)

使用Python动画粒子的薛定谔波函数&#xff08;ψ&#xff09;&#xff08;完整代码&#xff09; 使用曲柄-尼科尔森方法求解盒子中的粒子 Kowshik chilamkurthy 以后 发表于 书技术 4 分钟阅读 2月 2021&#xff0c; <> 1.4K 5 左图&#xff1a;来源&#xff0c;右图…

Leetcode-每日一题【剑指 Offer 56 - II. 数组中数字出现的次数 II】

题目 在一个数组 nums 中除一个数字只出现一次之外&#xff0c;其他数字都出现了三次。请找出那个只出现一次的数字。 示例 1&#xff1a; 输入&#xff1a;nums [3,4,3,3]输出&#xff1a;4 示例 2&#xff1a; 输入&#xff1a;nums [9,1,7,9,7,9,7]输出&#xff1a;1 限制…

网工必须掌握的5种组网技术,你会了吗?

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 目录 一、VLAN技术 1、VLAN是什么&#xff1f; 2、VLAN的作用 ①提高网络安全性 ②提高了网络的灵活性性 ③增强了网络的健壮性 二、D…

SPDK的块设备抽象层,从一个简单的示例程序讲起

最早的SPDK仅仅是一个NVMe驱动,但现在的SPDK已经不是原来的SPDK了,其功能涵盖了整个存储栈。为了能够实现丰富的功能,SPDK实现了一个块设备抽象层,其功能与Linux内核的块设备层类似,这个块设备抽象层称为BDEV。 块设备抽象层BDEV在整个SPDK栈中的位置如图所示,它位于中间…

解决一个Yarn异常:Alerts for Timeline service 2.0 Reader

【背景】 环境是用Ambari搭建的大数据环境&#xff0c;版本是2.7.3&#xff0c;Hdp是3.1.0&#xff1b;我们用这一套组件搭建了好几个环境&#xff0c;都有这个异常告警&#xff0c;但hive、spark都运行正常&#xff0c;可以正常使用&#xff0c;所以也一直没有去费时间解决这…

Linux lvs负载均衡

LVS 介绍&#xff1a; Linux Virtual Server&#xff08;LVS&#xff09;是一个基于Linux内核的开源软件项目&#xff0c;用于构建高性能、高可用性的服务器群集。LVS通过将客户端请求分发到一组后端服务器上的不同节点来实现负载均衡&#xff0c;从而提高系统的可扩展性和可…

读磁盘概述

磁盘结构 磁道C 磁头H 扇区S 一个磁盘有很多个盘面&#xff0c;上面是其中一个盘面&#xff0c;每个盘面对应一个磁头。 磁盘的最小单元是扇区&#xff0c;通过CHS可以定位到一个确定的扇区&#xff0c;每个扇区一般是512个字节。 CHS寻道方式 设置好寄存器的值&#xff0c;然…

ElasticSearch可视化管理工具之ElasticHD

推荐的五种客户端 1.Elasticsearch-Head &#xff0c; Elasticsearch-Head 插件在5.x版本之后已不再维护&#xff0c;界面比较老旧。 2.cerebro 据传该插件不支持ES中5.x以上版本。 3.kinaba 功能强大&#xff0c;但操作复杂&#xff0c;以后可以考虑。 4.Dejavu 也是一个 Elas…

Balanced Multimodal Learning via On-the-fly Gradient Modulation

摘要 多模态学习通过整合不同的感官&#xff0c;有助于全面理解世界。因此&#xff0c;多种输入模式有望提高模型的性能&#xff0c;但我们实际上发现&#xff0c;即使多模态模型优于其单模态模型&#xff0c;它们也没有得到充分利用。具体地说&#xff0c;在本文中&#xff0…

xilinx noc路由 axi smartconnect

s00先看勾选了谁&#xff0c;可以勾选多个master 口&#xff0c;然后看address命中那个&#xff1b; 最终只能去其中一个 如果没有勾选&#xff0c;即使地址命中也不能过去&#xff1b; smartconnect 替换了interconnect了&#xff1b; 路由是看address editor中的addr去路由&…

v-for为什么要设置key值及为什么不建议使用index作为key

为什么要设置key值 提高diff算法的效率,可以更加快捷找出变化和新增的元素&#xff0c;更高效的更新虚拟DOM&#xff08;key是给每一个vnode的唯一id,可以依靠key,更准确, 更快的拿到oldVnode中对应的vnode节点。&#xff09; 为什么不建议使用index作为key 以下面代码为例&…