题意:
给定n个整数,分别代表柱子的高度。问我们能接住多少青豆。
思路:
考虑每一个柱子,他上面会有多少个青豆。
接着会发现,这取决于他两边的最高的柱子有多高,如果左边最高的柱子高为L,右边最高的柱子高为R,那么这个柱子上的豆子数量是:
max(0, min(L, R) - a[i]
于是问题就很简单的变成前后缀最值问题了。
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 5, mod = 998244353;
int l[N], r[N], a[N];
void solve()
{
int n = 0;
int x = 0;
while(cin >> x){
a[++n] = x;
}
l[0] = r[n + 1] = -1e18;
for (int i = 1; i <= n; i++){
l[i] = max(a[i], l[i - 1]);
}
for (int i = n; i >= 1; i--){
r[i] = max(a[i], r[i + 1]);
}
int ans = 0;
for (int i = 2; i <= n - 1; i++){
ans += max(0ll, min(l[i - 1], r[i + 1]) - a[i]);
}
cout << ans;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int tt = 1;
// cin >> tt;
while (tt--) solve();
return 0;
}