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