#P16702. [MCO 2026] 雨水收集

    ID: 16948 Type: RemoteJudge 5000ms 1024MiB Tried: 0 Accepted: 0 Difficulty: 9 Uploaded By: Tags>线段树分块2026MCC/MCO(马来西亚)

[MCO 2026] 雨水收集

题目描述

在 MCO 小镇中,并排矗立着 NN 座塔,从左到右第 ii 座塔(下标从 00 开始)的初始高度为 HiH_i。一场大雨过后,塔顶可能会积水。MCO 的居民龙 Evirir 想知道这些塔一共能收集多少雨水。

对于一段塔的区间 [l,r][l, r](即塔 l,l+1,…,rl, l+1, \ldots, r),其降雨量定义如下:

  • 对于每个塔 jj,当且仅当存在塔 ii 和 kk,满足 l≤i≤j≤k≤rl \le i \le j \le k \le r,并且塔 ii 与塔 kk 都至少比塔 jj 高 xx,即$$H_i - H_j \ge x \quad \text{且} \quad H_k - H_j \ge x,$$则可以在塔 jj 上积起高度为 x≥0x \ge 0 的水柱。
  • 定义 f(j)f(j) 为塔 jj 上能够积起的水柱的最大高度。
  • 降雨量定义为f(l)+f(l+1)+⋯+f(r), f(l) + f(l+1) + \cdots + f(r), 即这些塔上可积起的最大水柱高度之和。

Evirir 对新一代马来西亚 OI 选手充满信心,所以如果只让你求一个区间的降雨量,那就太简单了。相反,你需要处理 QQ 个操作,每个操作属于以下两种类型之一:

  • 更新:0 l r x0\ l\ r\ x --- 对所有满足 l≤i≤rl \leq i \leq r 的 HiH_i 加上 xx。
  • 询问:1 l r1\ l\ r --- 输出塔区间 [l,r][l,r] 的降雨量。

注意:

  • 在回答区间 [l,r][l, r] 的询问时,计算 f(i)f(i) 和降雨量时不应考虑该区间外的塔。区间外的塔不能用于蓄水。
  • 塔的高度可以为负数,但规则保持不变。相关说明可参考样例。

输入格式

第一行包含两个用空格分隔的整数 NN 和 QQ。

第二行包含 NN 个用空格分隔的整数 H0,H1,…,HN−1H_0, H_1, \ldots, H_{N-1}。

接下来有 QQ 行,每行表示一个操作,包含若干个用空格分隔的整数:

  • 更新:0 l r x0\ l\ r\ x --- 对所有满足 l≤i≤rl \le i \le r 的 HiH_i 加上 xx。
  • 询问:1 l r1\ l\ r --- 输出塔区间 [l,r][l, r] 的降雨量。

输出格式

对于每个询问,按顺序输出区间 [l,r][l, r] 中塔的降雨量,每个答案占一行。

9 7
5 3 1 3 -1 1 2 5 3
1 1 6
1 0 8
0 1 4 2
0 6 8 -4
1 1 6
1 3 6
1 6 6
6
21
2
0
0
5 6
-2 3 1 4 2
0 0 2 1
0 0 4 3
0 3 4 8
0 0 0 10
0 1 3 1
1 0 4
10

提示

提示

样例 1‾\underline{样例\ 1}

该样例适用于子任务 1、5 和 6。

共有 N=9N = 9 座塔。下面是更新与询问的可视化:

:::align{center} :::

在第一次询问 1 1 6\texttt{1 1 6} 中,考虑的是第 11 到第 66 座塔。来看高度为 11 的塔 j=5j = 5。塔 55 上可以积起高度为 11 的水柱,因为:

  • 塔 i=3i = 3 的高度为 33,比塔 55 高 22。
  • 塔 k=6k = 6 的高度为 22,比塔 55 高 11。 但塔 55 上不能积起高度为 22 的水柱,因为不存在满足 j≤k≤6j \le k \le 6 的塔 kk,其高度至少比塔 55 高 22(即高度至少为 1+2=31 + 2 = 3)。注意,不能取 k=7k = 7,因为 kk 不在此次询问的区间 [1,6][1, 6] 内。因此,f(5)=1f(5) = 1,这由塔 55 上的 11 个水格表示。

在第二次询问 1 0 8\texttt{1 0 8} 中,考虑的是第 00 到第 88 座塔。来看高度为 −1-1 的塔 j=4j = 4。塔 44 上可以积起高度为 66 的水柱,因为塔 i=0i = 0 和塔 k=7k = 7 的高度都为 55,都比塔 44 高 66。同时也可以证明,66 已经是可能的最大高度,因此 f(4)=6f(4) = 6。

在更新 0 1 4 2\texttt{0 1 4 2} 中,第 11 到第 44 座塔的高度都增加了 22。在更新 0 6 8 -4\texttt{0 6 8 -4} 中,第 66 到第 88 座塔的高度都减少了 44。

在询问 1 6 6\texttt{1 6 6} 中,请注意:即使一座塔的高度为负数,它仍然需要周围有更高的塔才能蓄水。

注意,通过取 i=j=ki = j = k,总是可以在一座塔上积起至少高度为 00 的水柱。

样例 2‾\underline{样例\ 2}

该样例适用于子任务 1、5 和 6。

评分

对于所有测试用例,输入满足以下限制:

  • 1≤N≤5⋅1061 \le N\leq 5 \cdot 10^6
  • 1≤Q≤5⋅1041 \le Q \leq 5 \cdot 10^4
  • 对所有 0≤i≤N−10 \le i \le N - 1,有 ∣Hi∣≤107|H_i| \leq 10^7
  • 对所有更新和询问,都有 0≤l≤r≤N−10 \le l \le r \le N - 1
  • 对所有更新,都有 ∣x∣≤107|x| \leq 10^7
  • 至少有一个操作是询问。
子任务 分值 额外限制
11 88 N,Q≤1000N, Q \leq 1000
22 Q=1Q = 1
33 1616 N≤106N \leq 10^6 且输入中没有更新操作
44 1818 更新中 l=rl = r 和 x>0x > 0,且询问中 [l,r]=[0,N−1][l, r] = [0, N - 1]
55 2525 N≤5⋅105N \leq 5 \cdot 10^5
66 ---