洛谷 3374 树状数组

题目:
已知一个数列,你需要进行下面两种操作:将某一个数加上 x,求出某区间每一个数的和。输入:第一行包含两个正整数 n,m,分别表示该数列数字的个数和操作的总个数。第二行包含 n 个用空格分隔的整数,其中第 i个数字表示数列第 i项的初始值。接下来 m 行每行包含 3个整数,表示一个操作。1 x k 含义:将第 x个数加上 k;2 x y 含义:输出区间 [x,y]内每个数的和。

 

思路:
1.整体思路:
(1)构建树状数组:build
(2)单点修改:add
(3)区间查询;search


2.具体思路:
(1)构建树状数组(目的:为了更好地储存一段数列)
将整个数列按照123······n进行编号。

设:n等于7,构造出的树状数组如下图所示。

f6e252cce1f94166829be94a454566a7.jpg

 

(2)单点修改(对数列中第x个数加上k)
   从根结点出发,判断编号x在父节点的左儿子里还是右儿子里,然后继续往下查询,直到找到了叶结点,那它就是x序号无疑了。

如图所示,从区间1-4中找到序号2。

a474795aea9f44ae9c00e90723226dab.jpg

 

(3)区间查询(查询序号x到序号y对应的数值的和)

  • 若区间包含于目标区间,直接返回;
  • 若左儿子与目标区间有交集查询左儿子;
  • 若右儿子与目标区间有交集查询右儿子;

如图所示,从区间1-4中查询区间2-3

 81b5160caa2645ac9d88d88d9b2c8dce.jpg

 代码展示:

cfaa893940f04f469742bd62c9221da1.png

d607494244ba472ba4e5bdac9f40b9b7.png 

fc8bf26073f340baabaafddb92a7ebc2.png 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值