题目:http://poj.org/problem?id=2155
学习了这篇博客的讲解彻底弄懂二维树状数组,做了二维树状数组的第1题。
虽然是二维,但跟一维的思想基本相同,只不过一维时用C[i]表示a[i-lowbit[i]+1] ~ a[i]的和,二维时用c[i][j]表示a[i-lowbit[i]+1][j-lowbit[j]+1] ~ a[i][j]的和。
先来看一维的问题,则矩阵退化成线段,(x,y)点退化成x点,操作也变为C x y和Q x:
(1)对于C x y,即对[x,y]之间的所有点翻转,相当于对[1,x-1]之间的所有点翻转,再对[1,y]之间的所有点翻转
(2)对于Q x,即查询点x进行了多少次翻转,由于y = x,y = y+lowbit(y),y = y+lowbit(y)都覆盖了点x,所以我们只需对这些c[y]累加,即可得到x点的翻转次数
将上述思想推广到二维,则
(1)对于C a b c d,即对[a,b] -> [c,d]之间的所有点进行翻转,相当于对[1,1] -> [a-1,d]之间的所有点进行