题目是说对一个01矩形区间有两种操作:一是置反某一块区间[a][b]--->[c][d](0变1,1变0),二是询问[i][j]位置处的当前值是0还是1。转化为树状数组的方法便是:01矩阵初始化为0,对于置反操作,等价于将小矩形块的四角置反(以此表示这四角代表的矩形块被执行置反),于是我们对于置反操作,只操作四角的即可(可以累加操作次数,也可以单纯的模拟置反操作,此时可利用bool数组),然后对于询问,只统计其左上方的矩阵元素的和(累加)奇偶情况,奇数说明最终置1,否则置0。
注意修改函数add只是对于[i][j]以及其后的点起作用,而我们统计的时候显然是不把自身统计在内的,所以对于子矩形块终点[c][d],要分别++,这样就可避免统计的时候把自己算在内(刘汝佳的讲义讲到这题时没提到这点),然后就是裸的二维树状数组操作了。楼教的题,很不错。
POJ2155
最新推荐文章于 2020-10-26 21:09:29 发布