📅  最后修改于: 2023-12-03 14:58:20.208000             🧑  作者: Mango
本篇题解是关于 GATE CS 2018 的题目 18 的介绍。
有 $n$ 个门,每个门要么向左转要么向右转。开始时所有的门都是向左转的。现在有 $q$ 个操作,每个操作表示将一段区间的门全部翻转,即从向左转变为向右转,或者从向右转变为向左转。
在进行完所有的操作后,你需要回答最后一扇门是朝左还是朝右。
第一行包含两个整数 $n$ 和 $q$,表示门的数量和操作数量。
接下来 $q$ 行,每行包含两个整数 $l$ 和 $r$,表示对门的编号在区间 $[l, r]$ 内的门进行一次翻转操作。
输出一行,包含一个字符,表示所有操作执行后最后一扇门的朝向。字符为 L 表示朝左,字符为 R 表示朝右。
$1 \leq n,q \leq 10^6$
5 2
2 4
1 5
L
本题解提供一种快速解决本题的思路,即使用一个整数变量来保存所有门当前的状态,然后对每个操作进行处理,并更新当前门的状态。最后判断最后一扇门的状态即可。
gates
来保存当前门的状态,每一位表示对应门的状态,为 1 表示向右转,为 0 表示向左转。初始值为 0
。gates ^= ((1 << r) - (1 << (l - 1)))
。def solve(n: int, q: int, queries: List[Tuple[int, int]]) -> str:
gates = 0
for l, r in queries:
gates ^= ((1 << r) - (1 << (l - 1)))
return 'R' if gates & 1 == 1 else 'L'
返回结果为'L'
或者'R'
。
## 题解思路
本题解提供一种快速解决本题的思路,即使用一个整数变量来保存所有门当前的状态,然后对每个操作进行处理,并更新当前门的状态。最后判断最后一扇门的状态即可。
- 用一个变量 `gates` 来保存当前门的状态,每一位表示对应门的状态,为 1 表示向右转,为 0 表示向左转。初始值为 `0`。
- 对每个操作进行处理。对于区间 $[l, r]$,可以使用按位取反来完成全部翻转的操作。即`gates ^= ((1 << r) - (1 << (l - 1)))`。
- 返回结果。判断最后一个门的状态即可。
## 代码实现
```python
def solve(n: int, q: int, queries: List[Tuple[int, int]]) -> str:
gates = 0
for l, r in queries:
gates ^= ((1 << r) - (1 << (l - 1)))
return 'R' if gates & 1 == 1 else 'L'
返回结果为'L'
或者'R'
。