洛谷B3731 [信息与未来 2017] 房屋积水 题解

本文已同步至洛谷专栏。

思路

第一步肯定是处理出 \(R\) 数列和 \(a\) 数列。

接着对于每个 \(i \in [1,n]\),考虑位置 \(i\) 上面水的高度。

\(i\) 上面水的高度一定是左边有一个 \(j<i\)\(a_j>a_i\)\(j\),右边也有一个 \(k>i\)\(a_k>a_i\)\(k\)

答案就是 \(j\sim k\) 之间水的高度减去 \(a_i\),即 \(\min{(a_j,a_k)}-a_i\)

可能有多个 \(j\)\(k\),需要取最大的 \(a_j\)\(a_k\)

也有可能没有 \(j\)\(k\),那么答案为 0。为了统一计算,可以不限制 \(a_j>a_i\)\(a_k>a_i\),将位置 \(i\) 上面水的高度设为 \(\max{(0,\min{(a_j,a_k)}-a_i)}\)

这样就能得出答案,时空复杂度均为 \(O(n)\)

Code(只展示关键代码)

//输入,生成a和r。我这里不写,请读者自行思考。
for (int i = 1; i <= n; i++)//左边的最大值。
  lmx[i] = max(lmx[i - 1], a[i]);
for (int i = n; i; i--)//右边的最大值。
  rmx[i] = max(rmx[i + 1], a[i]);
for (int i = 1; i <= n; i++)//累加答案
  ans += max(0, min(lmx[i], rmx[i]) - a[i]);
posted @ 2026-01-21 19:52  aaalys  阅读(9)  评论(0)    收藏  举报
//雪花飘落效果