#P15589. [KTSC 2026] 瞭望塔 / Observation Tower

[KTSC 2026] 瞭望塔 / Observation Tower

题目描述

NN 座瞭望塔,依次编号 0N10\sim N-1。塔 ii 的高度为 H[i]H[i],其瞭望分数为 S[i]S[i]。初始,S[i]=0S[i]=0

对于 0i<jN10\le i\lt j\le N-1,我们称塔 jj 能从塔 ii 瞭望到,当且仅当对于任意 ikj1i\le k\le j-1,都有 H[k]<H[j]H[k]\lt H[j]。注意,jij\le i 时,塔 jj 不能从塔 ii 瞭望到。

当从某座塔上执行一次瞭望操作时,能从这座塔瞭望到的所有塔的瞭望分数都会自增 11

现在有 QQ 个事件,每个事件是如下的三个类型之一:

  • 瞭望:给定 II0IN20\le I\le N-2),在塔 II 上执行一次瞭望操作。
  • 测量:给定 L,RL,R0LRN10\le L\le R\le N-1),计算 S[L]++S[R]S[L]+\cdots+S[R]
  • 平移:给定 L,R,VL,R,V0LRN10\le L\le R\le N-1)。对于任意 LiRL\le i\le R,令 H[i]H[i]+VH[i]\gets H[i]+V

瞭望事件用数组 [I][I] 表示;测量事件用数组 [L,R][L,R] 表示;平移事件用数组 [L,R,V][L,R,V] 表示。注意到这三类事件的数组大小均不同,所以可以用数组大小区分不同的事件类型。

事件按照 0Q10\sim Q-1 的顺序依次发生,事件 iiE[i]E[i] 表示。

令测量事件总数为 KK,按照发生顺序编号 0K10\sim K-1。求出所有测量事件的结果。

实现细节

这是一道函数式交互题。你不必,也不应实现 main 函数。

你应当实现以下的函数:

vector<long long> tower_events(vector<int> H, vector<vector<int>> E)
  • HH:大小为 NN 的整数数组。
  • QQ:大小为 QQ 的整数数组,表示事件。
  • 返回一个大小为 KK 的整数数组 XX,其中 X[i]X[i] 表示第 ii 个测量事件的结果。
  • 该函数被调用恰好一次。

输入格式

示例评分程序的输入格式如下:

  • 11 行:NN QQ
  • 22 行:H[0]H[0] H[1]H[N1]H[1] \dots H[N - 1]
  • 对于所有 0iQ10 \le i \le Q - 1
    • 3+i3 + i 行:E[i]|E[i]| E[i][0]E[i][E[i]1]E[i][0] \dots E[i][|E[i]| - 1]

输出格式

示例评分程序按以下格式输出答案:

  • 对于所有 0iK10 \le i \le K - 1
    • 1+i1 + i 行:X[i]X[i]
5 5
1 2 3 4 5
1 0
2 1 3
3 1 2 1
1 1
2 0 4

3
6

10 11
7 7 9 5 8 10 2 9 2 2
1 1
3 6 8 6
1 1
2 1 9
1 3
1 8
2 2 4
1 5
3 1 1 7
1 1
2 0 9

5
3
10

提示

数据范围

  • 5N10000005\le N\le 1\, 000\, 000
  • 1Q2500001\le Q\le 250\, 000
  • 1H[i]1091\le H[i]\le 10^9
  • 对于瞭望事件,0IN20\le I\le N-2
  • 对于测量事件,0LRN10\le L\le R\le N-1
  • 对于平移事件,0LRN10\le L\le R\le N-1109V109-10^9\le V\le 10^9
  • 在平移事件发生后,保证 H[i]1H[i]\ge 1
  • 至少有一个测量事件。

子任务

编号 得分 限制
11 1717 N,Q150000N,Q\le 150\, 000;在所有测量事件中,L=0,R=N1L=0,R=N-1
22 6 6 N,Q150000N,Q\le 150\, 000;无平移事件
33 1212 N,Q150000N,Q\le 150\, 000
44 1919 在所有瞭望事件中,I=0I=0;在所有平移事件中,L=RL=R;平移事件至多发生 3000030\, 000
55 2121 在所有测量事件中,L=RL=R;在所有平移事件中,L=RL=RV0V\ge 0
66 2525 无额外限制

样例

样例 11

考虑以下调用:

tower_events([1, 2, 3, 4, 5], [[0], [1, 3], [1, 2, 1], [1], [0, 4]])
  • 在第一个事件之后,H=[1,2,3,4,5]H = [1, 2, 3, 4, 5]S=[0,1,1,1,1]S = [0, 1, 1, 1, 1]
  • 第二个事件(即测量事件 00)的结果为 S[1]+S[2]+S[3]=3S[1] + S[2] + S[3] = 3
  • 在第三个事件之后,H=[1,3,4,4,5]H = [1, 3, 4, 4, 5]S=[0,1,1,1,1]S = [0, 1, 1, 1, 1]
  • 在第四个事件之后,H=[1,3,4,4,5]H = [1, 3, 4, 4, 5]S=[0,1,2,1,2]S = [0, 1, 2, 1, 2]
  • 最后一个事件(即测量事件 11)的结果为 S[0]++S[4]=6S[0] + \cdots + S[4] = 6

因此,该函数应返回 [3,6][3, 6]

样例 22

考虑以下调用:

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][5, 3, 10]