思路:
建兩個單調棧一個從前往後,一個從後往前,如果棧頂比當前的牛高,就將當前牛丟進棧,遇到更高的就出棧,以此類推,最後取最大。
:
#include <cstdio>
#include <iostream>
using namespace std;
int n,maxn,jl;
int ans1[50001],heig[50004],music[50004],jll[50001];
int main ()
{
scanf ("%d", &n);
for (int i = 1; i <= n; ++i) scanf("%d%d",&heig[i], &music[i]);
for (int i = 1; i <= n; ++i)//模擬
{
while (jl && heig[i] > heig[jll[jl]])
ans1[i] += music[jll[jl--]];
jll[++jl] = i;
}
jl = 0;
for (int i = n; i >= 1; --i)
{
while (jl && heig[i] > heig[jll[jl]])
ans1[i] += music[jll[jl--]];
jll[++jl] = i;
}
for (int i = 1; i <= n; ++i)
maxn = max (maxn, ans1[i]);
printf("%d",maxn);
return 0;
}