| 题目名称 | 4487. 高度区间 |
|---|---|
| 输入输出 | high.in/out |
| 难度等级 | ★★★ |
| 时间限制 | 1000 ms (1 s) |
| 内存限制 | 256 MiB |
| 测试数据 | 50 |
| 题目来源 |
|
| 开放分组 | 全部用户 |
| 提交状态 | |
| 分类标签 | |
| 分享题解 |
| 通过:2, 提交:6, 通过率:33.33% | ||||
|
|
100 | 7.294 s | 117.57 MiB | C++ |
|
|
100 | 7.804 s | 117.58 MiB | C++ |
|
|
98 | 9.669 s | 117.61 MiB | C++ |
|
|
92 | 10.501 s | 117.59 MiB | C++ |
|
|
20 | 7.344 s | 9.23 MiB | C++ |
|
|
20 | 7.481 s | 11.53 MiB | C++ |
| 关于 高度区间 的近10条评论(全部评论) |
|---|
想象有 $N$ 列积木,从左到右编号为 $1$ 到 $N$,其中 $N$ 是奇数。第 $i$ 列积木的高度为 $v_i$。特别地,最中间一列(第 $\frac{N+1}{2}$ 列)是最高的一列(或并列最高),设其高度为 $\text{max}$。
现在考虑两个整数 $A$ 和 $B$,满足 $0 \le A < B \le \text{max}$。我们做如下操作:
对于每一列,只保留高度在 $[A, B]$ 范围内的积木(即把高度低于 $A$ 的积木全部拿掉,把高度高于 $B$ 的积木也拿掉)。这样得到一个“截取”后的积木形状。
如果这个截取后的形状关于最中间那一列的竖直中心线是左右对称的,我们就称 $(A,B)$ 是一个好的二元组。
现在有 $Q$ 次修改操作,每次修改某一列的高度(但不会修改最中间那一列,且保证修改后最中间一列仍然是全局最高之一)。对于每一次修改前以及最终状态,请你求出好的二元组 $(A,B)$ 的总数。
第一行两个整数 $N, Q$。
第二行 $N$ 个整数 $v_1, v_2, \dots, v_N$。
接下来 $Q$ 行,每行两个整数 $x, h$,表示将第 $x$ 列的高度改为 $h$(保证 $x \neq \frac{N+1}{2}$ 且 $h \le \text{max}$)。
输出 $Q+1$ 行,每行一个整数,表示对应时刻的好二元组数量。
5 5 1 5 8 7 3 1 8 4 1 2 0 4 0 5 8
5 6 1 3 6 36
7 0 4 3 1 7 2 3 5
7
7 10 1 6 7 10 5 4 3 2 7 2 8 2 9 2 9 2 10 6 5 6 6 6 7 6 8 6 9
8 8 5 3 3 2 4 4 4 5 7
对于样例2:
好的二元组为:$(0,1),(2,3),(2,4),(3,4),(5,6),(5,7),(6,7)$,共$7$个。
本题输入输出量极大,请一定要使用快速读入和快速输出
对于前$20$%的数据,$Q=0$,$N \le 300$,且所有 $v_i \le 300$
对于前$40$%的数据,$Q=0$
对于随后$30$%的数据,每次修改时,该列高度的变化量至多为 $1$
对于$100$%的数据:
- $3 \le N \le 2 \times 10^5$,且 $N$ 为奇数;
- $0 \le Q \le 2 \times 10^5$;
- $0 \le v_i \le 10^6$;
- 任意时刻,中间列 $v_{(N+1)/2}$ 是全局最大值之一;
- 每次修改的列 $x \ne \frac{N+1}{2}$,且修改后的高度 $h \le \text{max}$。