【问题描述】

现在有n个宽度为1的矩形按如下图(左边的)所示的方式排在了一起:

用肉眼容易看出,在左图内部面积最大的矩形如右图绿色部分所标注。

现在我们考虑将其中一些宽度为1的矩形取出,按照原顺序再次紧密地靠在一起,比如在原图中,如果我们取出从左往右数的第2、4、5、6个矩形,那么我们得到下面的左图,而该图形内部的最大矩形则如右图黄色部分所示。

现在,你的任务就是从原图中取出若干个宽度为1的矩形并使用上面的方式组成新的图形,使得新的图形中,内部的最大矩形面积最大。

【输入格式】

第一行为一个正整数T,表示数据组数。 接下来T组数据,每组数据第一行为一个正整数n,表示矩形个数,接下来一行n个正整数,第i个数hi表示图形中从左到右第i个矩形的高度。

【输出格式】

对每组数据输出一行一个正整数,表示最大的“最大矩形”面积。

【输入样例】
3
4
1 2 3 4
3
8 1 9
3
8 6 9
【输出样例】
6
16
18
【数据规模与约定】

对于30%的数据,有1<=n<=15,

对于60%的数据,有1<=n<=1000,

对于100%的数据,有1<=T<=10, 1<=n,hi<=100000,每个测试点n的和不超过200000。

题目分析

这是一个裸的单调栈,我转载了别人的代码如下。设第一个比当前数(序号为i)小的左侧数为left[i]。算法的流程是这样的:设现在程序循环到第i个数,如果当前,栈顶的数大于等于第i个数,说明什么?说明序号i以后的数j,它们的left[j]一定不会是栈顶那个数,因为选了j一定能选i。既然这样,直接把j从栈中弹出,然后继续判断……直至第i个数遇到比它小的栈顶的数。这个数就是left[i],因为比i小的数只会被更小更优的数替换。然后,将i入栈。这样就把那些无用的,值大于第i个数,却在第i个数左边的数统统用第i个数替换了。这就去除了冗余状态。

代码实现

#include<bits/stdc++.h>
using namespace std;
#define N 100001
#define int long long
int s[N],a[N],w[N],T,n,top,ans;
signed main(){
freopen("rectangle.in","r",stdin),freopen("rectangle.out","w",stdout);
cin>>T;
while (T--){
cin>>n;
for (register int i=;i<=n;++i) cin>>a[i];
sort(a+,a+n+);
a[n+]=top=ans=;
for (register int i=;i<=n+;++i)
if (s[top]<a[i]&&top)
s[++top]=a[i],w[top]=;
else{int wide=;
while(s[top]>=a[i]&&top){
wide+=w[top];
ans=max(ans,wide*s[top--]);
}s[++top]=a[i],w[top]=wide+;
}cout<<ans<<"\n";
}
return ;
}

代码分析

原来的HDU1506也是很水,这一题也是,唯一的区别在于排序了。我将会认真的讲解一下单调栈问题。

我们要维护的栈是一个单调递增的数列,为什么呢?我们的答案最好是用较高的答案加上去的,所以用递增数列。我们的答案矩阵是长乘宽,我们维护一个队列,当前的数字比栈顶还大,自然是递增的,入栈即可。如果小于等于,我们保存的是栈中比这个数字小(等于)的数字,当然这时候我们把宽度加一下啊。。。因为这时候我们维护的矩形可能是最大的,自然要记录了。我们一边出栈一边更新答案,虽然有可能不会更新掉答案。这里贼骚:原来的宽度是不是被pop掉了?我们再把宽度加回去哈。居然有这种操作,原因是原来的部分被算过一遍了,我们如果有更新ans就更新过了,我们可以把这个部分当做一个小矩形加入栈里面。如果最后还有答案怎么办啊?我们用一个高度为0的矩形入栈,然后你懂得。

当然如果你要压行,我不介意。本来要讲一讲我和小姐姐的故事,下次再说。

【FZSZ2017暑假提高组Day1】最大矩形的更多相关文章

  1. 【FZSZ2017暑假提高组Day1】华容道游戏

    [问题描述] 华容道是一种有趣的滑块游戏,大概是下面这个样子的. 游戏局面由一个2*2的曹操滑块,五个2*1的蜀将滑块(横竖是不定的).四个1*1的小兵滑块以及两个空的位置构成,玩家需要利用空的位子移 ...

  2. 【FZSZ2017暑假提高组Day1】确定小组

    [问题描述] 有n个人坐成一排,这n个人都在某一个小组中,同一个小组的所有人所坐的位置一定是连续的. 有一个记者在现场进行采访,他每次采访都会询问一个人其所在的小组有多少人,被询问的每个人都给出了正确 ...

  3. 【FZSZ2017暑假提高组Day2】圆盘时钟

    [问题描述] 作为出题人的小Z相信大家对上图这样的圆盘时钟都不会陌生——在理想圆盘时钟上,秒针每一分钟转一圈,分针每一小时转一圈,时针每12小时转一圈,它们均是匀速转动的,在0点时三条针均指向表盘上的 ...

  4. luogu1003铺地毯[noip2011 提高组 Day1 T1]

    题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小到大的顺序平行于 ...

  5. Noip2011 提高组 Day1 T1 铺地毯 + Day2 T1 计算系数

    Day1 T1 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小 ...

  6. 18/9/9牛客网提高组Day1

    牛客网提高组Day1 T1 中位数 这好像是主席树??听说过,不会啊... 最后只打了个暴力,可能是n2logn? 只过了前30%  qwq #include<algorithm> #in ...

  7. Noip2011 提高组 Day1 T3 Mayan游戏

    题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定 ...

  8. GZOJ 1361. 国王游戏【NOIP2012提高组DAY1】

    国王游戏[NOIP2012提高组DAY1] Time Limit:1000MS Memory Limit:128000K Description 国王游戏(game.cpp/c/pas) [问题描述] ...

  9. 暑假提高组集训Day1 T1

    说实话,今天的题真的有点难! ~备受打击~ 我们先来看一看第一题吧 看起来好像不太简单,其实并不难 下面来提供两种方法吧 1.做法一 //签到题 /* 那么这一题就是告诉你n个点的坐标,把它们分别放到 ...

随机推荐

  1. Shell 变量替换及测试

    声明:$ 后面跟linux可执行命令 一.变量替换                   语法                      说明 ${变量名#匹配规则} 从变量的开头进行规则匹配,将符合最 ...

  2. java 几种对象

     POJO(plain old java object):普通的java对象,有别于特殊的java对象(含继承约束等)和EJB.POJO一般只有一系列的属性和相应的get.set方法.     PO( ...

  3. L2-024. 部落(并查集)*

    L2-024. 部落 参考博客 #include<cstdio> #include<iostream> #include<set> #include<algo ...

  4. 【leetcode】429. N-ary Tree Level Order Traversal

    problem 429. N-ary Tree Level Order Traversal solution1:Iteration /* // Definition for a Node. class ...

  5. 熟悉基本的Linux文件系统命令

      修改配置是以后工作中必然经历的,要做好基础工作,两天的学习也说明了在Linux系统中修改配置的重要性,多看多学习. 每周总结学习和经验到网站上,坚持1w个小时,加油! Linux的安装环境 cen ...

  6. 让你简洁清晰真正的了解什么是JavaSCript

    学习JavaScript高级程序设计第三版第一步.JavaScript简介不光在这一本说介绍,很多书都提及到,我就简单的把重点记录下来,当做整理吧,以便自己及大家观看. 1995年,我出生了,Java ...

  7. 2018.4.24 快排查找第K大

    import java.util.Arrays; /* 核心思想:利用快排思想,先假定从大到小排序,找枢纽,枢纽会把大小分开它的两边,当枢纽下标等于k时, 即分了k位在它左边或右边,也就是最大或最小的 ...

  8. findHomography(src_points, dst_points, CV_RANSAC)

    Homography,即单应性,该函数用于求src_points转换为dst_poinsts的单应性矩阵: 为了理解单应性,必须先引入透视变换的概念:把空间坐标系中的三维物体或对象转变为二维图像表示的 ...

  9. HTML文本元素标签

    <b></b>表示关键字和产品名称如:<b>查看效果</b> 效果:加粗 查看效果 <strong></strong>表示重要的 ...

  10. Python2和Python3关于reload()用法的区别

    Python2 中可以直接使用reload(module)重载模块. Pyhton3中需要使用如下两种方式: 方式(1) >>> from imp >>> imp. ...