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

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[i] >= H[s.back()])
            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;
}
posted @ 2024-03-17 00:47  chenfy27  阅读(3)  评论(0编辑  收藏  举报