luogu#P16702. [MCO 2026] 雨水收集

    ID: 16924 远端评测题 5000ms 1024MiB 尝试: 0 已通过: 0 难度: 8 上传者: 标签>线段树分块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,当且仅当存在塔 iikk,满足 lijkrl \le i \le j \le k \le r,并且塔 ii 与塔 kk 都至少比塔 jjxx,即$$H_i - H_j \ge x \quad \text{且} \quad H_k - H_j \ge x,$$则可以在塔 jj 上积起高度为 x0x \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 --- 对所有满足 lirl \leq i \leq rHiH_i 加上 xx
  • 询问:1 l r1\ l\ r --- 输出塔区间 [l,r][l,r] 的降雨量。

注意:

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

输入格式

第一行包含两个用空格分隔的整数 NNQQ

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

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

  • 更新:0 l r x0\ l\ r\ x --- 对所有满足 lirl \le i \le rHiH_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,比塔 5522
  • k=6k = 6 的高度为 22,比塔 5511。 但塔 55 上不能积起高度为 22 的水柱,因为不存在满足 jk6j \le k \le 6 的塔 kk,其高度至少比塔 5522(即高度至少为 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,都比塔 4466。同时也可以证明,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。

评分

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

  • 1N51061 \le N\leq 5 \cdot 10^6
  • 1Q51041 \le Q \leq 5 \cdot 10^4
  • 对所有 0iN10 \le i \le N - 1,有 Hi107|H_i| \leq 10^7
  • 对所有更新和询问,都有 0lrN10 \le l \le r \le N - 1
  • 对所有更新,都有 x107|x| \leq 10^7
  • 至少有一个操作是询问。
子任务 分值 额外限制
11 88 N,Q1000N, Q \leq 1000
22 Q=1Q = 1
33 1616 N106N \leq 10^6 且输入中没有更新操作
44 1818 更新中 l=rl = rx>0x > 0,且询问中 [l,r]=[0,N1][l, r] = [0, N - 1]
55 2525 N5105N \leq 5 \cdot 10^5
66 ---