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

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

相关推荐
ZhengEnCi19 小时前
模型训练完整流程:从数据准备到模型上线的 10 个关键步骤(全文可跑)
后端·算法
吞下星星的少年·-·1 天前
Div.3 CF 1131A题(排序,模拟)
算法·模拟·排序
aichitang20241 天前
代数拓扑学与现代前沿视角
考研·算法·数学建模·ai·拓扑学·高考
二本咕咕-机械转码1 天前
FreeRTOS深入解析(一)_链表与并发保护——哨兵循环链表、排序键游标、临界区与关调度
单片机·算法·链表
-银雾鸢尾-1 天前
两数之和-C++实现
c++·算法
j7~1 天前
【动态规划算法专题】动态规划五部曲实战:泰波那契数、三步问题、最小花费爬楼梯
c++·算法·动态规划·数据结构与算法
倍利福猎头公司官方账号1 天前
大企业HR如何向猎头公司清晰传达AI岗位的技术需求?
人工智能·算法·机器人·求职招聘·业界资讯
揽星河..1 天前
【C++】类和对象
c++·算法
D e re k ZH1 天前
C++ 并发、未定义行为与工程化难点(No 3)
数据结构·c++·算法·面试