1. 题目
题意:给出一个 N×N的矩阵,矩阵初始为 0,有 M个操作,操作有如下两种:
- 给定一个矩形区域,该区域内的 0 变成 1,1 变成 0(区间异或)
- 询问某个位置的值为 0 还是 1
N≤1000,M≤50000
有多组数据,数据组数不超过 10 组
2. 题解
主要是来记录一下二维差分方法的。
设原二维数组为 a[i][j]
设差分数组为 d[i][j]
则 d[i][j]=a[i][j]+a[i−1][j−1]−a[i−1][j]−a[i][j−1]
然后 a[i][j]的值就是 d的二维前缀和。
这个推导就不做过多赘述了。可以根据二维前缀和的容斥原理弄出来。
修改二维矩阵 [(x1,y1),(x2,y2)]时,就 d[x1][y1]+=1,d[x2+1][y2+1]+=1,d[x1][y2+1]−=1,d[x2+1][y2]−=1即可。
这题的话。。。
修改就是 d[x1][y1]⊕=1,d[x2+1][y2+1]⊕=1,d[x1][y2+1]⊕=1,d[x2+1][y2]⊕=1
单点询问就是求前缀异或和啦~~(≧▽≦)/~啦啦啦
代码:
0 条评论