P15589 [KTSC 2026] 瞭望塔 / Observation Tower

题目描述

有 $N$ 座瞭望塔,依次编号 $0\sim N-1$。塔 $i$ 的高度为 $H[i]$,其瞭望分数为 $S[i]$。初始,$S[i]=0$。 对于 $0\le i\lt j\le N-1$,我们称塔 $j$ 能从塔 $i$ 瞭望到,当且仅当对于任意 $i\le k\le j-1$,都有 $H[k]\lt H[j]$。注意,$j\le i$ 时,塔 $j$ 不能从塔 $i$ 瞭望到。 当从某座塔上执行一次瞭望操作时,能从这座塔瞭望到的所有塔的瞭望分数都会自增 $1$。 现在有 $Q$ 个事件,每个事件是如下的三个类型之一: - **瞭望**:给定 $I$($0\le I\le N-2$),在塔 $I$ 上执行一次瞭望操作。 - **测量**:给定 $L,R$($0\le L\le R\le N-1$),计算 $S[L]+\cdots+S[R]$。 - **平移**:给定 $L,R,V$($0\le L\le R\le N-1$)。对于任意 $L\le i\le R$,令 $H[i]\gets H[i]+V$ 瞭望事件用数组 $[I]$ 表示;测量事件用数组 $[L,R]$ 表示;平移事件用数组 $[L,R,V]$ 表示。注意到这三类事件的数组大小均不同,所以可以用数组大小区分不同的事件类型。 事件按照 $0\sim Q-1$ 的顺序依次发生,事件 $i$ 用 $E[i]$ 表示。 令测量事件总数为 $K$,按照发生顺序编号 $0\sim K-1$。求出所有测量事件的结果。 ### 实现细节 **这是一道函数式交互题**。你不必,也不应实现 `main` 函数。 你应当实现以下的函数: ```cpp vector tower_events(vector H, vector E) ``` - $H$:大小为 $N$ 的整数数组。 - $Q$:大小为 $Q$ 的整数数组,表示事件。 - 返回一个大小为 $K$ 的整数数组 $X$,其中 $X[i]$ 表示第 $i$ 个测量事件的结果。 - 该函数被调用恰好一次。

输入格式

示例评分程序的输入格式如下: * 第 $1$ 行:$N$ $Q$ * 第 $2$ 行:$H[0]$ $H[1] \dots H[N - 1]$ * 对于所有 $0 \le i \le Q - 1$: * 第 $3 + i$ 行:$|E[i]|$ $E[i][0] \dots E[i][|E[i]| - 1]$

输出格式

示例评分程序按以下格式输出答案: * 对于所有 $0 \le i \le K - 1$: * 第 $1 + i$ 行:$X[i]$

说明/提示

### 数据范围 - $5\le N\le 1\, 000\, 000$; - $1\le Q\le 250\, 000$; - $1\le H[i]\le 10^9$; - 对于瞭望事件,$0\le I\le N-2$; - 对于测量事件,$0\le L\le R\le N-1$; - 对于平移事件,$0\le L\le R\le N-1$,$-10^9\le V\le 10^9$; - 在平移事件发生后,保证 $H[i]\ge 1$; - 至少有一个测量事件。 ### 子任务 | 编号 | 得分 | 限制 | | :-: | :-: | :- | | $1$ | $17$ | $N,Q\le 150\, 000$;在所有测量事件中,$L=0,R=N-1$ | | $2$ | $ 6$ | $N,Q\le 150\, 000$;无平移事件 | | $3$ | $12$ | $N,Q\le 150\, 000$ | | $4$ | $19$ | 在所有瞭望事件中,$I=0$;在所有平移事件中,$L=R$;平移事件至多发生 $30\, 000$ 次 | | $5$ | $21$ | 在所有测量事件中,$L=R$;在所有平移事件中,$L=R$ 且 $V\ge 0$ | | $6$ | $25$ | 无额外限制 | ### 样例 #### 样例 $1$ 考虑以下调用: ```cpp tower_events([1, 2, 3, 4, 5], [[0], [1, 3], [1, 2, 1], [1], [0, 4]]) ``` * 在第一个事件之后,$H = [1, 2, 3, 4, 5]$,$S = [0, 1, 1, 1, 1]$。 * 第二个事件(即测量事件 $0$)的结果为 $S[1] + S[2] + S[3] = 3$。 * 在第三个事件之后,$H = [1, 3, 4, 4, 5]$,$S = [0, 1, 1, 1, 1]$。 * 在第四个事件之后,$H = [1, 3, 4, 4, 5]$,$S = [0, 1, 2, 1, 2]$。 * 最后一个事件(即测量事件 $1$)的结果为 $S[0] + \cdots + S[4] = 6$。 因此,该函数应返回 $[3, 6]$。 #### 样例 $2$ 考虑以下调用: ```cpp tower_events([7, 7, 9, 5, 8, 10, 2, 9, 2, 2], [[1], [6, 8, 6], [1], [1, 9], [3], [8], [2, 4], [5], [1, 1, 7], [1], [0, 9]]) ``` 该函数应返回 $[5, 3, 10]$。