攒青豆

540 阅读1分钟

题意:

给定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;
}