P3374 【模板】树状数组 1 题解

# P3374 【模板】树状数组 1

题目描述

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

  • 将某一个数加上 x;

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

输入格式

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

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

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

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

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

输出格式

输出包含若干行整数,即为所有操作 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\\% 的数据,1 \\le n \\le 8,1\\le m \\le 10;

对于 70\\% 的数据,1\\le n,m \\le 10\^4;

对于 100\\% 的数据,1\\le n,m \\le 5\\times 10\^5,1\\le x\\le y\\le n,-2\^{31}\\le k\<2\^{31}。

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

样例说明:

!\[\](https://cdn.luogu.com.cn/upload/pic/2256.png)

故输出结果 14 和 16。

题面为上 ↑ ↑ ↑

接下来,正文:

首先,我们可以分析一下本题的本质,即他在考察什么。

例如:我们可以把

  • 将某一个数加上 x;

删除,就会发现这题是一个前缀和,当然,如果你把他加上去,就会发现他不是递归。

不管了,先发代码:

复制代码
#include<bits/stdc++.h>
using namespace std;
int n,m;
int c[500005];
void add(int x,int y){
	for(;x<=n;x+=(x&-x))c[x]+=y;
}
int query(int x){
	int sum=0;
	for(;x;x-=(x&-x))sum+=c[x];
	return sum;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		int a;
		cin>>a;
		add(i,a);
	}
	while(m--){
		int op,x,y;
		cin>>op>>x>>y;
		if(op==1)add(x,y);
		else cout<<(query(y)-query(x-1))<<"\n";
	}
	return 0;
}

接下来,解释:

  • n:数组长度。
  • m:操作次数。
  • c[500005]:树状数组。

add函数:

  • 作用:把第 x 个数字,加上 y。

query函数:

  • 作用:算出从第 1 个,到第 x 个数字的全部总和。

主函数:

  1. 先输入两个数:一共几个数字、要做几次操作。

  2. 输入初始的每个数字,用 add 把它们存进数组里,相当于把所有数字都初始化。

  3. 循环处理每一次操作:

    1. 读入操作类型 op 和两个数字 x、y

    2. 如果 op=1:改数 ,第 x 个数加上 y

    3. 如果不是 1(就是2):求 第 x 个 until 第 y 个 之间所有数的和:

      用 1 to y 的总和 减去 1 to (x-1) 的总和,剩下的就是中间一段的和,然后输出结果。

then,没了。

so,the end..................。

咋还在看?没了..................

The End

你可千万别以为没了..........................................但可惜是真的没了

相关推荐
Nil2087 小时前
leetcode 198打家劫舍
算法·leetcode·职场和发展
Shaoshing7 小时前
前缀和与差分
java·数据结构·算法·前缀和·差分
loulanyue_8 小时前
构建房产认知决策智能:Harness底座与AI自进化的技术实践——读贝壳首席算法科学家尹俊希2026云栖专场演讲
人工智能·算法
碧海银沙音频科技研究院8 小时前
基于炬芯ATS录音卡BLE控制协议
人工智能·嵌入式硬件·算法·语音识别
suhan9 小时前
【数据结构】三、栈和队列:6.链队列、双端队列、队列的应用(树的层次遍历、广度优先BFS、先来先服务FCFS)
数据结构·后端·算法
姜鱼问生9 小时前
Docker Volume 备份与恢复实战:不停机迁移数据
后端·算法·架构
suhan9 小时前
【数据结构】三、栈和队列:5.顺序队列(循环队列)(初始化,判空判满,入队,出队,实例)
数据结构·后端·算法
suhan9 小时前
【数据结构】三、栈和队列:3.链栈(链栈栈的初始化,判空,进栈,出栈,读取栈顶,链栈实例)
数据结构·后端·算法
大雄很用心9 小时前
如何理解时间复杂度与空间复杂度?| 面试刷题笔记02
算法
姜鱼问生9 小时前
服务器磁盘满了?从告警到清理的完整排查
后端·算法·架构