• POJ 2559 Largest Rectangle in a Histogram(单调栈)


    原题目链接:http://poj.org/problem?id=2559

    解题思路:

    用单调栈求任意每个区间的最小值及区间长度,为什么记录区间最小值呢?(木桶装水原理,装水量取决于最短木板长)。枚举每个区间,维护最大答案。

    //自行百度单调栈

    AC代码:

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<stack>
      4 
      5 using namespace std;
      6 
      7 stack<long long> le,ri;
      8 int n;
      9 struct kkk {
     10     long long v,l,r;
     11     long long xb;
     12 }a[100001];
     13 
     14 void chushihua() {
     15     for(int i = 1;i <= n; i++) {
     16         scanf("%lld",&a[i].v);
     17         a[i].xb = i;
     18     }
     19     while(!le.empty()) le.pop();
     20     while(!ri.empty()) ri.pop();
     21 }
     22 
     23 void left() {
     24     le.push(1);
     25     for(int i = 2;i <= n; i++) {
     26         if(le.empty()) {
     27             le.push(i);
     28             continue;
     29         }
     30         if(a[i].v >= a[le.top()].v) le.push(i);
     31         if(a[i].v < a[le.top()].v) {
     32             a[le.top()].r = i;
     33             le.pop();
     34             while(true) {
     35                 if(le.empty()) break;
     36                 if(a[le.top()].v > a[i].v) {
     37                     a[le.top()].r = i;
     38                     le.pop();
     39                 }
     40                 else break;
     41             }
     42             le.push(i);
     43         }
     44     }
     45     le.pop();
     46     a[n].r = n + 1;
     47     while(!le.empty()) {
     48         a[le.top()].r = n + 1;
     49         le.pop();
     50     }
     51 }
     52 
     53 void right() {
     54     ri.push(a[n].xb);
     55     for(int i = n - 1;i >= 1; i--) {
     56         if(ri.empty()) {
     57             ri.push(i);
     58             continue;
     59         }
     60         if(a[i].v >= a[ri.top()].v) ri.push(i);
     61         if(a[i].v < a[ri.top()].v) {
     62             a[ri.top()].l = i;
     63             ri.pop();
     64             while(true) {
     65                 if(ri.empty()) break;
     66                 if(a[ri.top()].v > a[i].v) {
     67                     a[ri.top()].l = i;
     68                     ri.pop();
     69                 }
     70                 else break;
     71             }
     72             ri.push(i);
     73         }
     74     }
     75     ri.pop();
     76     a[1].l = 0;
     77     while(!ri.empty()) {
     78         a[ri.top()].l = 0;
     79         ri.pop();
     80     }
     81 }
     82 
     83 long long answer() {
     84     long long ans = 0;
     85     for(int i = 1;i <= n; i++) {
     86         ans = max(ans,a[i].v * (a[i].r - a[i].l - 1));
     87     }
     88     return ans;
     89 }
     90 
     91 void tiaoshi() {
     92     for(int i = 1;i <= n; i++)
     93         cout << i << " " << a[i].l << " " << a[i].r << " " << a[i].v << endl;
     94 }
     95 
     96 int main() {
     97     while(true) {
     98         scanf("%d",&n);
     99         if(n == 0) return 0;
    100         chushihua();
    101         left();
    102         right(); 
    103         printf("%lld
    ",answer());
    104     }
    105     return 0;
    106 }
  • 相关阅读:
    文件IO学习
    简单哈希表学习
    关于二叉树的遍历
    关于多点共线问题
    关于线程
    时间复杂度O()与KMP算法
    单链表相关
    拷贝构造函数与深浅拷贝
    在windows把python写成bat文件的坑
    python学习手册:第二十五章——oop
  • 原文地址:https://www.cnblogs.com/lipeiyi520/p/11237289.html
Copyright © 2020-2023  润新知