#P3006. 舱带覆写
舱带覆写
舱带覆写
- 输入文件:
big.in - 输出文件:
big.out
题目背景
远航母舰的外壳被划分成一条长度为 n 的线性舱带,位置编号为 1, 2, ..., n。初始时,所有位置的颜色均为 0。
维护中心会按时间顺序执行 m 条覆写指令。第 i 条指令不会直接给出区间端点,而是由控制参数 p, q 和当前编号 i 自动生成两个锚点:
- a_i = ((i × p + q) mod n) + 1
- b_i = ((i × q + p) mod n) + 1
随后,系统会把区间 [min(a_i, b_i), max(a_i, b_i)] 上的所有位置都覆写成颜色 i。
所有指令执行结束后,观测员会对若干区间进行统计,想知道每段舱带中最终一共出现了多少种不同颜色。
题目描述
给定整数 n, m, p, q,对每个 i = 1, 2, ..., m 执行以下操作:
- 计算两个位置 a_i = ((i × p + q) mod n) + 1,b_i = ((i × q + p) mod n) + 1;
- 设 l_i = min(a_i, b_i),r_i = max(a_i, b_i);
- 将区间 [l_i, r_i] 上的所有位置都覆写成颜色 i。
全部覆写结束后,有 Q 次询问。每次给出一个区间 [l, r],你需要回答最终状态下这段区间中一共出现了多少种不同颜色。
注意:
- 颜色 0 表示该位置从未被任何指令覆写;
- 如果区间内出现了若干颜色相同的位置,这种颜色只计算一次。
输入格式
第一行四个整数 n, m, p, q,含义如上。
第二行一个整数 Q,表示询问个数。
接下来 Q 行,每行两个整数 l, r,表示一次询问。
输出格式
输出共 Q 行。
第 i 行输出一个整数,表示第 i 次询问的答案。
输入输出样例
样例 1
输入:
8 5 2 5
4
1 8
1 3
2 6
7 8
输出:
3
2
2
1
样例解释
执行全部 5 次覆写后,最终颜色数组为:
1 3 3 5 5 5 5 5
因此:
- 区间 [1, 8] 中出现了颜色 1, 3, 5,答案为 3;
- 区间 [1, 3] 中出现了颜色 1, 3,答案为 2;
- 区间 [2, 6] 中出现了颜色 3, 5,答案为 2;
- 区间 [7, 8] 中只有颜色 5,答案为 1。
数据范围
对于全部数据,满足:
- 1 ≤ n, m ≤ 10⁶
- 1 ≤ Q ≤ 2 × 10⁵
- 1 ≤ p, q ≤ 10⁹
- 1 ≤ l ≤ r ≤ n
评测共 20 个测试点,每个测试点 5 分,互不捆绑。
| 测试点 | 分值 | n | m | Q |
|---|---|---|---|---|
| 1 ~ 4 | 20 分 | ≤ 2000 | ||
| 5 ~ 10 | 30 分 | ≤ 3 × 10⁵ | ||
| 11 ~ 14 | 20 分 | ≤ 6 × 10⁵ | ||
| 15 ~ 20 | 30 分 | 完整约束 | ||