hdu1506 Largest Rectangle in a Histogram (单调栈)

来源:互联网 发布:versions for mac过期 编辑:程序博客网 时间:2024/05/20 20:19

lef[i],rig[i]分别保存第i个矩形向左和向右分别能扩展多远。

以向右扩展为例:

从左向右枚举每一个矩形i,如果高度height[i]大于等于栈顶元素的高度或栈为空,入栈。

若height[i]<s.top().height,依次弹出栈中元素直到height[i]>=s.top().height。则每一次弹出的元素,向右最多能扩展到i。然后将i入栈。

枚举完了之后栈可能非空,则栈中元素一定可以扩展到最右。

最后(lef[i] + rig[i] - 1)*height[i]的最大值即为答案。注意用long long。

代码(140MS,3028K):

#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#include <stack>using namespace std;struct Node{int idx, height;Node(int a, int b) : idx(a), height(b) {}};int n;int height[100005];int lef[100005];int rig[100005];int main() {while (~scanf("%d", &n) && n) {for (int i = 1; i <= n; i++)scanf("%d", &height[i]);stack<Node> sl;stack<Node> sr;for (int i = 1; i <= n; i++) {Node cur = Node(i, height[i]);while (!sr.empty() && sr.top().height > cur.height) {Node t = sr.top();sr.pop();rig[t.idx] = cur.idx - t.idx;}sr.push(cur);}while (!sr.empty()) {Node t = sr.top();sr.pop();rig[t.idx] = n - t.idx + 1;}for (int i = n; i >= 1; i--) {Node cur = Node(i, height[i]);while (!sl.empty() && sl.top().height > cur.height) {Node t = sl.top();sl.pop();lef[t.idx] = t.idx - cur.idx;}sl.push(cur);}while (!sl.empty()) {Node t = sl.top();sl.pop();lef[t.idx] = t.idx;}long long ans = 0;for (int i = 1; i <= n; i++)ans = max(ans, (long long)(rig[i] + lef[i] - 1) * height[i]);cout << ans << endl;}return 0;}


0 0
原创粉丝点击