题目链接:
题目解析:
有一句很重要的话:发出的能量只被两边最近的且比 它高的发射站接收。显然要用单调栈。
也就是要分别求每个数左边和右边碰到的第一个比它大的数的位置。
这次用了c++自带的stack,注意在判断语句里s.size()一定要写在最前面(血的教训QAQ)
AC代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<stack>
using namespace std;
#define ll long long
const int MAXN=1000000+10;
ll arr[MAXN],s[MAXN],sum[MAXN],n,ans = -1;
stack <ll> stck;
int main()
{
scanf("%lld",&n);
arr[0] = 2000000100;
arr[n+1] = 2000000100;
for(int i = 1; i <= n; i++) scanf("%lld%lld",&arr[i],&s[i]);
for(int i = 1; i <= n+1; i++)
{
while(stck.size() && arr[i] > arr[stck.top()])//这里顺序不能反!
{
sum[i] += s[stck.top()];
stck.pop();
}
stck.push(i);
}
while(stck.size()) stck.pop();
for(int i = n; i >= 0; i--)
{
while(stck.size() && arr[i] > arr[stck.top()])
{
sum[i] += s[stck.top()];
stck.pop();
}
stck.push(i);
}
for(int i = 1; i <= n; i++) ans = max(ans,sum[i]);
printf("%lld",ans);
return 0;
}