📌  相关文章
📜  门| Sudo GATE 2020 Mock III(2019 年 1 月 24 日)|第 32 题(1)

📅  最后修改于: 2023-12-03 15:12:45.198000             🧑  作者: Mango

这是 Sudo GATE 2020 Mock III(2019 年 1 月 24 日)第 32 题的主题。

题目描述

有一排门,每个门都有一个状态,要么是开着的,要么是关着的。现在,有 $n$ 个人要通过这一排门,第 $i$ 个人依次考虑门从左到右的状态,并执行相应的操作,具体为:

  • 如果门是开着的,第 $i$ 个人会将它关上。
  • 如果门是关着的,第 $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)$