📌  相关文章
📜  门| Sudo GATE 2020 Mock I(2019 年 12 月 27 日)|第 35 题(1)

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

题目描述:

有一排 n 个门,所有门默认均为关着的状态。你需要进行 m 次操作,每次操作都给出两个正整数 a, b,表示你要将从第 a 个门到第 b 个门(含两端)的状态进行取反(即关着的门打开,开着的门关闭)。经过这 m 次操作后,你需要输出最终所有开着的门的编号。

输入格式:
  • 第一行包含两个整数 n 和 m。
  • 接下来 m 行,每行包含两个正整数 a 和 b。
输出格式:
  • 按顺序输出最终状态为开启的门的编号,每个编号之间用空格隔开,如果没有任何一个门开启,则输出一个空行。
样例输入:
5 2
1 2
2 4
样例输出:
3 5
解题思路:

本题可以使用差分的思想,对于每一个区间操作,可以将 a 和 b 两个位置上的数 +1/-1,进行差分处理后,遍历所有的门,统计状态为 1 的门的编号即可。

代码示例(Python):
n, m = map(int, input().split())
diff = [0] * (n + 1)
for i in range(m):
    a, b = map(int, input().split())
    diff[a - 1] += 1
    diff[b] -= 1

ans = []
x = 0
for i in range(n):
    x += diff[i]
    if x > 0:
        ans.append(i + 1)

if len(ans) > 0:
    print(" ".join(map(str, ans)))
else:
    print("")
代码说明
  1. 输入:读入两个整数 n 和 m,表示门的数量和操作的次数。
  2. 差分:先定义长度为 n+1 的 diff 数组,初始化为 0。对于每次输入的区间,将左端点 a-1 对应的 diff 值累加 1,右端点 b 对应的 diff 值累减 1。这里使用了 差分数组 模型进行计算。
  3. 遍历:从左到右遍历所有的门,统计状态为 1 的门的编号。
  4. 输出:如果存在开启的门,输出门编号;否则输出一个空行。