[POJ 2559] 最大矩形面积

单调栈模板题

提供一种奇技淫巧的解法,均摊O(n)

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#define int long long
const int N = 100010;
int ans, n;
int a[N];
int l[N], r[N];
inline int read()
{
    int x = 0, f = 1;
    char ch = getchar();
    while (!isdigit(ch))
        f = (ch == '-') ? -1 : 1, ch = getchar();
    while (isdigit(ch))
        x = x * 10 + (ch - '0'), ch = getchar();
    return x * f;
}
main()
{
    // freopen("in.txt", "r", stdin);
    while (1)
    {
        n = read();
        if (n == 0)
            break;
        ans = 0;
        for (int i = 1; i <= n; i++)
            a[i] = read(), l[i] = r[i] = i;
        for (int i = 1; i <= n; i++)
            while (l[i] > 1 && a[l[i] - 1] >= a[i])
                l[i] = l[l[i] - 1];
        for (int i = n; i >= 1; i--)
            while (r[i] < n && a[r[i] + 1] >= a[i])
                r[i] = r[r[i] + 1];
        for (int i = 1; i <= n; i++)
            ans = std::max(ans, (r[i] - l[i] + 1) * a[i]);
        std::cout << ans << '\n';
    }
    return 0;
}

原文地址:https://www.cnblogs.com/wyctstf/p/11367492.html

时间: 2024-10-21 07:54:57

[POJ 2559] 最大矩形面积的相关文章

poj 1151 Atlantis(矩形面积并)

题意:每组给出矩形左上角和右下角坐标,求矩形面积并: 思路:沿水平方向计算面积并:(切成水平条): #include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> using namespace std; const int maxn=500; struct node{ double x; int l,r,t; //t为上下边标志

poj 1151 求矩形面积并 (线段树扫描线)

题意: 给出n个矩形的左下角和右上角坐标,求这n个矩形所构成的面积 思路: 线段树扫描线 这是第一次做到线段树扫描线,刚开始也不懂 如果不懂,可以看: http://www.cnblogs.com/scau20110726/archive/2013/04/12/3016765.html 和 http://www.faceye.net/search/69289.html 我是看第一个链接弄懂的 然后学习了第二位的方法 代码上也有比较详细的注释,想可以帮到大家 code: #include<cstd

poj 1151(离散化+矩形面积并)

题目链接:http://poj.org/problem?id=1151 关于离散化,这篇博客讲的很好:http://www.cppblog.com/MiYu/archive/2010/10/15/129999.aspx 我线段树还是不会写这个.. 借个图: ///离散化 #include <iostream> #include <stdio.h> #include <algorithm> #include <string.h> #include <cm

Poj 2559 Largest Rectangle in a Histogram(柱形统计图中的最大矩形面积)

 给出一个柱形统计图中,求其中的最大矩形面积 做完这道题,搜了一下题解大部分基本都是单调栈......然而做之前并不知道这是什么,其实用递推也可以做这道题,理解起来比较容易. 用两个数组l,r记录当前坐标可以向左和向右延伸的最远位置的坐标,然后就是递推了. 初始时将l[i],r[i]的值置为i,即自己的坐标.这里拿l[i]举例: 从左向右扫描统计图,计算当前位置的l[i]时,如果h[i] > h[ l[i] - 1 ]的话,那么l[i] = l[ l[i]-1  ]. 然后对于每个位置,an

poj 3277 City Horizon (线段树 扫描线 矩形面积并)

题目链接 题意: 给一些矩形,给出长和高,其中长是用区间的形式给出的,有些区间有重叠,最后求所有矩形的面积. 分析: 给的区间的范围很大,所以需要离散化,还需要把y坐标去重,不过我试了一下不去重 也不会出错, 所有的区间都能列出来,只是在查找的时候费点事. 给的矩形相当于在同一水平线上的,也就是y1坐标相当于为0,其他的就和 poj 1151 Atlantis 差不多了. 我写的思路是按照矩形面积并的思路写的: 但是还有另一种方法也是挺简单的,就是把给的矩形按照高从小到大排序,然后依次插入线段树

POJ&#183;1151 Atlantis&#183;线段树求矩形面积并

题目在这:http://poj.org/problem?id=1151 Atlantis Time Limit: 1000MS   Memory Limit: 10000K Description There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some of these texts even include maps of parts of the is

poj 2559求柱形图中最大矩形

两种解法.当中一种是用单调栈. 我想到的是第二种:最大的矩形,中间一定有个最矮的某个单位矩形.所以求出每一个包括矩形histogram[i]的最大矩形的面积.输出这些面积中最大那个就可以. key:用两个数组记录histogram[i]左右两边第一个比它小的单位矩形的序号leftLowerId[i]和rightLowerId[i].那么对于histogram[i],它自己的最大矩形面积就是(rightLowerId[i] - leftLowerId[i] - 1) *  histogram[i]

POJ 1151 / HDU 1542 Atlantis 线段树求矩形面积并

题意:给出矩形两对角点坐标,求矩形面积并. 解法:线段树+离散化. 每加入一个矩形,将两个y值加入yy数组以待离散化,将左边界cover值置为1,右边界置为2,离散后建立的线段树其实是以y值建的树,线段树维护两个值:cover和len,cover表示该线段区间目前被覆盖的线段数目,len表示当前已覆盖的线段长度(化为离散前的真值),每次加入一条线段,将其y_low,y_high之间的区间染上line[i].cover,再以tree[1].len乘以接下来的线段的x坐标减去当前x坐标,即计算了一部

poj 2559 Largest Rectangle in a Histogram 栈

// poj 2559 Largest Rectangle in a Histogram 栈 // // n个矩形排在一块,不同的高度,让你求最大的矩形的面积(矩形紧挨在一起) // // 这道题用的是数据结构做,也可以递推做,目前只会数据结构的 // // 对于每个高度h,求一个左边界L和右边界R,分别表示的意义是 // L是下标为j的矩形的高度的hj小于当前h的最大的j的值.则根据定义 // 我们可以知道j到i之间的h都是大于当前的hi的. // R是下标为k的矩形的高度的hk大于当前h的最