📅  最后修改于: 2023-12-03 15:12:47.254000             🧑  作者: Mango
现在有 $n$ 个门,门编号从 $1$ 到 $n$,每扇门都可以是打开或关闭的状态。
一开始,所有的门都是关闭的状态。
有 $m$ 个操作,每次操作会给你一个区间 $[l,r]$,并要求你将这个区间内的所有门状态取反(如果是打开的则改为关闭,如果是关闭的则改为打开)。
现在,请你依次执行这 $m$ 个操作,最后输出所有门的状态。
第一行包含一个整数 $n$。
第二行包含一个整数 $m$。
接下来 $m$ 行,每行描述一个操作,格式为两个整数 $l$ 和 $r$,表示该操作要求反转区间 $[l,r]$ 内的所有门的状态。
输出 $n$ 个整数,每个整数表示最终每个门的状态,如果是打开的则输出 $1$,如果是关闭的则输出 $0$。
$1 \le n, m \le 10^6$
输入:
5
3
1 2
1 3
3 5
输出:
0 1 0 1 1
这道题目简单的思路就是依次遍历每个区间,将区间内的门状态取反即可。具体实现方式可以使用数组模拟或者线段树实现。数组模拟比较简单,代码可读性也比较好。
代码片段如下:
#include <iostream>
using namespace std;
const int N = 1e6 + 10;
int n, m;
int w[N];
void update(int l, int r) {
for(int i = l; i <= r; i++) {
w[i] ^= 1;
}
}
int main() {
cin >> n >> m;
while(m--) {
int l, r;
cin >> l >> r;
update(l, r);
}
for(int i = 1; i <= n; i++) {
cout << w[i] << " ";
}
return 0;
}
数组模拟的时间复杂度为 $O(n + m)$,可以通过本题。