树状数组的区间加以及区间询问讲解
前置技能
基础树状数组。不会的话自己百度Orz。
要求掌握树状数组的以下操作:
- 熟悉树状数组原理以及用途。
- 单点修改,区间查询。
- 区间加,单点查询。
问题模型
树状数组实现区间加和区间查询。
实现
记
$A_i$为数列上面的第$i$个元素。
$delta_i=A_i-A_{i-1}, (1\leq i\leq n)$。
$exdel_i=delta_i\times i$
拓展公式:
$$A_i=\sum_{j=1}^{i}delta_j$$
推导区间加
$\Large Add(L,R,v)$
$$delta_L+=v$$
$$exdel_L+=v*L$$
$$delta_{R+1}-=v$$
$$exdel_{R+1}-=v*(R+1)$$
(好像没什么用啊……看看后面的询问推导)
推导区间询问
$\Large query(L,R)$
$$ans=\sum_{i=L}^{R}\sum_{j=1}^{i}delta_j\\=\sum_{i=1}^{L}(R-L+1)\times delta_i+\sum_{i=L+1}^{R}(R-L+1-(i-L))\times delta_i\\=\sum_{i=1}^{L}(R-L+1)\times delta_i+\sum_{i=L+1}^{R}(R+1-i)\times delta_i\\=\sum_{i=1}^{L}(R-L+1)\times delta_i+\sum_{i=L+1}^{R}(R+1)\times delta_i-\sum_{i=L+1}^{R}exdel_i\\=\sum_{i=1}^{R}(R+1)\times delta_i-\sum_{i=1}^{L}L\times delta_i-\sum_{i=L+1}^{R}exdel_i$$
于是前缀和随便弄几下就好了。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步