ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Fenwick啊啊啊

2021-07-30 00:03:01  阅读:188  来源: 互联网

标签:单点 前缀 sum 查询 啊啊啊 区间 Fenwick


Fenwick原生功能是单点修改+查询前缀和,如何将其转化成区间修改区间查询?

d[i] = a[i] - a[i - 1];
如果Fenwick维护的是d[i], 那么查询的就是d[i]的前缀和, 也就是a[i];
显然:d[i]的前缀和的前缀和就是前i个数的和。

那么怎么样查询一个区间呢?
直观上来感受, 需要将d[i]再求一遍和, 最后应该是 i ∗ d [ i ] i * d[i] i∗d[i]这种模样的东西。

把a[i]的前缀和用d[i]表示一下看看能发现什么规律:

∑ i = 1 n a [ i ] = ∑ i = 1 n ∑ j = 1 i d [ i ] = n d [ 1 ] + ( n − 1 ) d [ 2 ] + . . . + 2 d [ n − 1 ] + d [ n ] \sum_{i=1}^{n}a[i] = \sum_{i = 1}^{n}\sum_{j = 1}^{i}d[i]=nd[1]+(n-1)d[2]+...+2d[n-1]+d[n] i=1∑n​a[i]=i=1∑n​j=1∑i​d[i]=nd[1]+(n−1)d[2]+...+2d[n−1]+d[n]
得到了 ( n − i + 1 ) d [ i ] (n - i + 1)d[i] (n−i+1)d[i]这个东西。设 x [ i ] = ( n − i + 1 ) d [ i ] x[i] = (n - i + 1)d[i] x[i]=(n−i+1)d[i]。那么:
∑ i = 1 n a [ i ] = ∑ i = 1 n x [ i ] \sum_{i=1}^{n}a[i] = \sum_{i = 1}^{n}x[i] i=1∑n​a[i]=i=1∑n​x[i]

那么把x[i]扔到Fenwick里面,Fenwick就能对x[i]单点更新区间查询了。

显然对a[i]的区间更新可以转化为区间端点处的d[i]的单点更新,也就是端点处 x [ i ] = ( n − i + 1 ) d [ i ] x[i] = (n - i + 1)d[i] x[i]=(n−i+1)d[i]的更新。

对a[i]的区间查询能转化为对x[i]的前缀和查询。

标签:单点,前缀,sum,查询,啊啊啊,区间,Fenwick
来源: https://blog.csdn.net/u014754030/article/details/119223133

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有