(单调栈) $O(n)$
这个题目的思想和 仰视奶牛 是一样的 唯一不同的点就是可以从两边同时都接受能量 所以从左到右 再从右到左各扫一遍就好了
从左到右开始扫的话保证我的能量只自来于左边高度比我低的能量塔
从右到左开始扫的话保证我的能量只自来于右边高度比我低的能量塔
C++ 代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int h[N],v[N];
int e[N];
int main()
{
ios::sync_with_stdio(false);
int n;
cin>>n;
for (int i = 1; i <= n; ++ i ) cin>>h[i]>>v[i];
stack<int> stk;
for (int i = 1; i <= n; ++ i )
{
if (stk.empty()) stk.push(i);
else
{
while (!stk.empty() && h[i] > h[stk.top()])
{
e[i] += v[stk.top()];
stk.pop();
}
stk.push(i);
}
}
stack<int> stk_r;
for (int i = n; i >= 1; -- i )
{
if (stk_r.empty()) stk_r.push(i);
else
{
while (!stk_r.empty() && h[i] > h[stk_r.top()])
{
e[i] += v[stk_r.top()];
stk_r.pop();
}
stk_r.push(i);
}
}
int ret = 0;
for(int i = 1; i <= n; ++ i ) ret = max(ret,e[i]);
cout<<ret<<endl;
return 0;
}
$O(n)$
oh 是的 我当时脑子抽写错了 n2就过不了了 哈哈哈 谢谢大佬指错