📜  门| GATE CS 2018 |问题 18(1)

📅  最后修改于: 2023-12-03 14:58:20.208000             🧑  作者: Mango

门 | GATE CS 2018 | 问题 18

本篇题解是关于 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
  • 对每个操作进行处理。对于区间 $[l, r]$,可以使用按位取反来完成全部翻转的操作。即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'

Markdown 片段
## 题解思路

本题解提供一种快速解决本题的思路,即使用一个整数变量来保存所有门当前的状态,然后对每个操作进行处理,并更新当前门的状态。最后判断最后一扇门的状态即可。

- 用一个变量 `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'