📜  门|门CS 2010 |问题 10(1)

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

门|门CS 2010 |问题 10

问题描述

现在有 $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)$,可以通过本题。