📅  最后修改于: 2023-12-03 15:12:45.198000             🧑  作者: Mango
这是 Sudo GATE 2020 Mock III(2019 年 1 月 24 日)第 32 题的主题。
有一排门,每个门都有一个状态,要么是开着的,要么是关着的。现在,有 $n$ 个人要通过这一排门,第 $i$ 个人依次考虑门从左到右的状态,并执行相应的操作,具体为:
请你求出最终的门状态。
第一行包含两个整数 $n$ 和 $m$,分别表示人数和门数。
第二行包含 $m$ 个整数,每个整数表示对应门的初始状态,$0$ 表示关着,$1$ 表示开着。
接下来 $n$ 行,每行 $m$ 个整数,表示每个人对应门的操作。
输出一行 $m$ 个整数,表示最终的门状态。
$1 \leq n,m \leq 1000$
3 4
1 0 1 0
0 0 1 1
0 1 0 1
1 0 1 0
0 1 1 1
1 1 0 1
每次改变门的状态,我们可以令其进行异或运算($0 \oplus 1 = 1, 1 \oplus 1 = 0$),即可完成开关门的操作。
题目只是让我们求最终所以门的状态,因此我们不用真正模拟每个人的操作,直接将每个人的操作异或起来即可。
n, m = map(int, input().split())
doors = list(map(int, input().split()))
for i in range(n):
actions = list(map(int, input().split()))
for j in range(m):
doors[j] ^= actions[j]
print(' '.join(map(str, doors)))
时间复杂度:$O(nm)$ 空间复杂度:$O(m)$