一道单调栈的好题,充分说明了我只是明白了原理但是并不会应用。
这是题源poj2559
不过我发现要理解单调栈还是要有逆向思维啊
我也是看了大佬的博客才稍微明白了一些。
下面是代码;
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <stack>
#include <utility>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pll;
stack<pll> s;
stack <pll> null;
int main()
{
ll n;
while (cin >> n, n)
{
s = null;
ll h; ll ans = 0;
for (int i = 1; i <= n; i++)
{
scanf("%lld", &h);
ll w=0;
while (!s.empty() && s.top().first >= h)
{
ll height = s.top().first;
ll weight = s.top().second;
w += weight;
s.pop();
ans = max(ans, w * height);
}
s.push(make_pair(h,w + 1));
}
ll tmp = 0;
while (!s.empty())
{
ans = max(ans, s.top().first * (tmp + s.top().second));
tmp += s.top().second;
s.pop();
}
cout << ans << endl;
}
return 0;
}
最后,如果有大佬知道怎么让代码高亮,望赐教。