题目的操作是“取反”,所以我们并不关心“具体加了几次”,而是关心:
这个格子被操作了奇数次还是偶数次。
所以我们可以把原问题“操作 +1”转为 “操作 ^1”。于是,我们就可以用 “异或版二维差分”:
import sys
def main():
n, m = map(int, input().split())
g = [[0]*(n + 2) for _ in range(n + 2)]
# 差分操作
# 取反怎么差分? 异或操作?
for _ in range(m):
x1, y1, x2, y2 = map(int, input().split())
g[x1][y1] ^= 1
g[x1][y2 + 1] ^= 1
g[x2 + 1][y1] ^= 1
g[x2 + 1][y2 + 1] ^= 1
# for i in range(1, n + 1):
# for j in range(1, n + 1):
# g[i][j] += g[i-1][j] + g[i][j-1] - g[i-1][j-1]
for i in range(1, n + 1):
for j in range(1, n + 1):
g[i][j] ^= g[i-1][j] ^ g[i][j-1] ^ g[i-1][j-1]
print(g[i][j], end="")
print()
return 0
main()