poj 2155 Matrix 二维树状数组

http://poj.org/problem?id=2155

没有想到c数组用来记录改变次数 ,我一开始是记录了改变 如果c[x][y]=1 c[x][y]=0 这样子 行不通,因为c[x][y]管的不仅是一个点,无法确定 c的改变是因为哪个点改变而得到的。

可以参考论文:浅谈信息学竞赛中的“0”和“1” 

在这里解释一下为什么 增加头和尾+1 的两个节点的值 ,之后通过将1~所问的值n 的c[x]数组加起来sum%2 就可以得到 a[x] 是0还是1 

可以在纸上写写。

如果修改的全部区间在1~n内则计算sum的时候 肯定是偶数,因为有重复。

如果跨过只有一个跨过n 的跨区间的话,计算sum的时候肯定为奇数,因为只有一头在n的左边加一,另有头在n的右边加一,sum是不计算n的右边的。

如果有两个跨过n 的跨区间的话,根据 奇数+奇数=偶数 则sum为偶数

综上

如果sum为偶数则a[n]修改了0次或者偶数次 a[n]的值不变

如果sum为奇数,a[n]修改了奇数次,a[n]的值改变

可以参考https://blog.csdn.net/zxy_snow/article/details/6264135


posted @ 2018-03-22 20:14  LandingGuys  阅读(116)  评论(0编辑  收藏  举报