2371. 校门外的灯
1000ms
256MB
简单
模拟法
题目描述
在一座大门外长度为 $L$ 的马路上有一排路灯,每个相邻的路灯之间的间隔都是 1 米。我们将马路看成一个数轴,数轴上的每个整数点 $0, 1, 2, \dots, L$ 都安装有一个路灯,依次编号为 $0, 1, \dots, L$。
每个路灯的拉动开关可以按照 **关 $\to$ 红 $\to$ 黄 $\to$ 绿 $\to$ 蓝 $\to$ 关** 的顺序循环变化。我们用数字来代表路灯的五种状态:
- `0`:关
- `1`:红
- `2`:黄
- `3`:绿
- `4`:蓝
最初所有路灯都是关着的(状态为 `0`)。现有 $n$ 次行动,每次行动给出当前行动的类型 `op` 以及区间 $[s, t]$。每种行动的具体规则如下:
1. **`op = 1`**:把编号 $s$ 到 $t$ 之间所有的灯(包含 $s$ 和 $t$)都变成关闭状态(`0`)。
2. **`op = 2`**:把编号 $s$ 到 $t$ 之间所有处于开着状态的灯(状态不为 `0`)进行调整,拉动开关直到变成**红色**(`1`)或**绿色**(`3`)时停止。
3. **`op = 3`**:把编号 $s$ 到 $t$ 之间所有的灯进行调整,拉动开关直到变成**蓝色**(`4`)或**黄色**(`2`)时停止。
4. **`op = 4`**:把编号 $s$ 到 $t$ 之间所有的灯,按照它是区间内第几个灯就拉动几次的顺序进行调整。即位置 $s$ 上的灯拉动 1 下,位置 $s+1$ 上的灯拉动 2 下,……,位置 $t$ 上的灯拉动 $t - s + 1$ 下。
请计算:当所有行动顺序结束后,处于关闭状态(`0`)的灯的数量。
输入格式
- 第一行包含两个整数 $L$ 和 $n$ ($1 < L \le 10000, \quad n \le 10000$)。
- 接下来 $n$ 行,每行包含三个整数 `op`、`s`、`t` ($1 \le \text{op} \le 4, \quad 0 \le s \le t \le L$)。
输出格式
- 输出一行一个整数,表示所有行动结束后处于关闭状态(`0`)的灯的数量。
样例 1
输入 (Input)
10 2 4 2 8 2 1 9
输出 (Output)
5
- 对于 $100\%$ 的数据:$1 < L \le 10000$,$n \le 10000$,$0 \le s \le t \le L$。
- **状态转移逻辑提示**:
将开关拉动 1 下相当于状态值 `(state + 1) % 5`。
- 对于 **`op = 2`**:若当前状态为 `2`,拉 1 下变成 `3`(绿),停止;若当前状态为 `4`,拉 1 下变成 `0`,再拉 1 下变成 `1`(红),停止(相当于变为了 `1`)。
- 对于 **`op = 3`**:若当前状态为 `0` 或 `1`,拉动使其变为 `2`(黄);若当前状态为 `3`,拉动使其变为 `4`(蓝)。
› 输入 stdin
CtrlShiftEnter
‹ 输出 stdout
错误 stderr
操作成功