lgP1901 發射站能接受到的最大能量

chenfy27發表於2024-03-17

n個能量發射站排成一行,第i個發射站的高度為H[i],並能向兩邊同時發射值為V[i]的能量,發射的能量只會被兩邊最近且比它高的發射站接收。求所有發射站裡能接收的最大能量。
1<=n<=1e6; 1<=H[i]<=2e9; 1<=V[i]<=1e4

先用單調棧求出每個發射站發出的能量被誰接收,更新接收處的答案,然後求所有發射站的能量最大值即可。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=b;i>=a;i--)

const int N = 1000005;
int n, H[N], V[N], L[N], R[N], ans[N];
void solve() {
    cin >> n;
    rep(i,1,n) cin >> H[i] >> V[i];
    vector<int> s;
    rep(i,1,n) {
        while (!s.empty() && H[s.back()] <= H[i])
            s.pop_back();
        L[i] = s.empty() ? 0 : s.back();
        s.push_back(i);
    }
    s.clear();
    per(i,1,n) {
        while (!s.empty() && H[i] >= H[s.back()])
            s.pop_back();
        R[i] = s.empty() ? 0 : s.back();
        s.push_back(i);
    }
    rep(i,1,n) {
        if (L[i]) ans[L[i]] += V[i];
        if (R[i]) ans[R[i]] += V[i];
    }
    int best = 0;
    rep(i,1,n) best = max(best, ans[i]);
    cout << best << "\n";
}

signed main() {
    cin.tie(0)->sync_with_stdio(0);
    int t = 1;
    while (t--) solve();
    return 0;
}

相關文章