题目概述
有S*S台基站排列成正方形,每台基站都会记录连接它的手机数,并且该数目随时可能变化。要求输出指定矩形区域内连接手机的总数。
题目分析
由于 S 很大,矩形区域也可能很大,使用双重循环来计算总数会超市,所以需要一种特殊的数据结构:二维树状数组。与一维树状数组原理相同,假设二维数组为:
1 | a[][]={ |
那么树状数组C:
1 | C[1][1]=a11, C[1][2]=a11+a12; |
可以看出,不管是每一行还是每一列,树状数组C都符合x+=lowbit(x),所以只需要按下图所示的顺序进行一维的add,就能实现二维树状数组的add。

完整代码
1 |
|
自我总结
需要注意的点已经在代码中标注出来,还是要牢记,树状数组的下标从1开始,这一点千万不能忘记。在计算区域和的时候也要注意,getsum(r,t)-getsum(l-1,t)-getsum(r,b-1)+getsum(l-1,b-1)
,哪里要减1哪里不需要,要想明白。