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 81\\le m \\le 10

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

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

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

样例说明:

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

故输出结果 1416

题面为上 ↑ ↑

接下来,正文:

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

例如:我们可以把

  • 将某一个数加上 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

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

相关推荐
随意起个昵称1 小时前
区间dp-进阶题目1(进阶合并)
c++·算法·动态规划
伶俜661 小时前
鸿蒙原生应用实战(四)ArkUI 语音变声器:录音 + 4 种音效 + 音调变换算法
算法·华为·harmonyos
AKA__Zas2 小时前
芝士算法(滑动窗口片 2.0)
java·算法·leetcode·学习方法
变量未定义~2 小时前
摆放小球 、dp求解组合数、求解组合数2
数据结构·算法
加油码2 小时前
位图 BitMap:用一个 bit 管一个状态,空间直接省到位
c++·算法
四代水门2 小时前
LeetCode刷算法题(C++)
c++·算法·leetcode
一头老黄牛@2 小时前
飞书 × OpenClaw 接入指南:不用服务器,用长连接把机器人跑起来
数据结构·人工智能·程序人生·算法·决策树·自动化·推荐算法
Passionate.Z2 小时前
基于FPGA的CLAHE自适应限制对比度直方图均衡算法硬件verilog实现
图像处理·嵌入式硬件·算法·fpga开发·fpga
菜鸡爱玩6 小时前
线性代数矩阵相乘
线性代数·算法·矩阵