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