有n只熊。他们站成一排队伍,从左到右依次1到n编号。第i只熊的高度是ai。

一组熊指的队伍中连续的一个子段。组的大小就是熊的数目。而组的力量就是这一组熊中最小的高度。

迈克想知道对于所有的组大小为x(1 ≤ x ≤ n)的,最大力量是多少。

Input
单组测试数据。
第一行有一个整数n (1 ≤ n ≤ 2×10^5),表示熊的数目。
第二行包含n个整数以空格分开,a1, a2, ..., an (1 ≤ ai ≤ 10^9),表示熊的高度。
Output
在一行中输出n个整数,对于x从1到n,输出组大小为x的最大力量。
Input示例
10
1 2 3 4 5 4 3 2 1 6
Output示例
6 4 4 3 3 2 2 1 1 1

求出以每个元素为最小值的区间的左边界和右边界,保存下来,r[i] - l[i] +1 就是a[i]可作为最小值的区间的最大长度,然后这个长度的区间肯定包含这个长度-1的区间,于是依次取最大值。
#include<stdio.h>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXSIZE 200005 using namespace std; int a[MAXSIZE],l[MAXSIZE],r[MAXSIZE],s[MAXSIZE],ans[MAXSIZE]; int main()
{
freopen("in.txt","r",stdin);
memset(ans,,sizeof(ans));
memset(s,,sizeof(s));
int n,top;
cin>>n;
for(int i=;i<=n;i++)
cin>>a[i];
top = ;
for(int i=;i<=n;i++)
{
if(top==)
{
s[++top] = i;
l[i] = i;
} else
{
while(top>= && a[s[top]]>=a[i])
{
top--;
}
if(top==)
l[i] = ;
else
l[i] = s[top]+;
s[++top] = i;
}
} top = ;
for(int i=n;i>=;i--)
{
if(top==)
{
s[++top] = i;
r[i] = i;
} else
{
while(top>= && a[s[top]]>=a[i])
{
top--;
}
if(top==)
r[i] = n;
else
r[i] = s[top]-;
s[++top] = i;
}
} for(int i=;i<=n;i++)
{
ans[r[i]-l[i]+] = max(ans[r[i]-l[i]+],a[i]);
}
for(int i=n-;i>=;i--)
{
ans[i] = max(ans[i+],ans[i]);
}
for(int i=;i<=n;i++)
{
if(i!=) cout<<" ";
cout<<ans[i];
}
return ;
}

51nod 1437 迈克步——单调栈的更多相关文章

  1. 51nod 1437 迈克步 单调栈

    利用单调栈高效的求出,一个数a[i]在哪个区间内可作为最小值存在. 正向扫描,求出a[i]可做为最小值的区间的左边界 反向扫描,求出a[i]可作为最小值的区间的右边界 r[i] - l[i] +1 就 ...

  2. 51nod 1437 迈克步(单调栈)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1437 题意: 思路: 单调栈题.求出以每个数为区间最大值的区间范围即可. ...

  3. 51nod 1437:迈克步 单调栈基础题

    1437 迈克步 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  取消关注 有n只熊.他们站成一排队伍,从左到右依次1到 ...

  4. 51nod 1437 迈克步

    题目链接 先利用单调栈or其他方法找到一个元素g[i]作为最小值的区间,设为[L, R]. 那么长度为R-L+1的组的最大值ans=max(ans,g[i]).但是有一个问题: 比如6这个元素是长度为 ...

  5. 51nod1437 迈克步 单调栈

    考虑一个点作为最小值的区间$[L[i], R[i]]$ 那么这个区间的所有含$i$的子区间最小值都是$v[i]$ 因此,用单调栈求出$L[i], R[i]$后,对$R[i] - L[i] + 1$这个 ...

  6. 51nod 1102 【单调栈】

    思路: 对于这个高度往左能延伸最远x,往右能延伸最远y,(x+1+y)*w; 利用单调栈就行了: #include <cstdio> #include <stack> #inc ...

  7. 51nod 1102 面积最大的矩形 (单调栈)

    链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1102 思路: 首先介绍下单调栈的功能:利用单调栈,可以找到从左/ ...

  8. 51nod 1102 面积最大的矩形(单调栈)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1102 题意: 思路: 做法就是求出每个长方形向左向右所能延伸的最大距离. ...

  9. 51nod 1215 单调栈/迭代

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1215 1215 数组的宽度 题目来源: Javaman 基准时间限制:1 ...

随机推荐

  1. Navicat12破解教程

    Navicat12破解教程 1.下载Navicat12 并安装,打开Navicat12 点击14天试用,关闭软件 2.下载注册机: 个人百度网盘(版本更新可能不及时):https://pan.baid ...

  2. 52、saleforce 导入csv文件

    Load Data Using the Custom Object Import Wizard 1. 2. 3. 4. 5. 6.然后就导入成功了

  3. iOS之CAReplicatorLayer属性简介和使用

    1.CAReplicatorLayer简介 CAReplicatorLayer用于对图层进行复制,包括图层的动画也能复制!可以看着将某一段事务进行重复! #import <QuartzCore/ ...

  4. git submodule 删除及修改

    1.  删除子模块 # 逆初始化模块,其中{MOD_NAME}为模块目录,执行后可发现模块目录被清空 git submodule deinit {MOD_NAME} # 删除.gitmodules中记 ...

  5. PAT甲级——A1130 Infix Expression【25】

    Given a syntax tree (binary), you are supposed to output the corresponding infix expression, with pa ...

  6. CS如何调用JS

    this.ClientScript.RegisterStartupScript(this.GetType(), "", "RunClick()", true); ...

  7. ajax请求 Provisional headers are show

    请求被阻塞就会导致Provisional headers are show 我的原因是因为数据库 修改操作未提交导致表 锁住 . 后台操作该表超时

  8. Module not found: Error: Can't resolve '@babel/runtime/helpers/classCallCheck' and Module not found: Error: Can't resolve '@babel/runtime/helpers/defineProperty'

    These two mistakes are really just one mistake, This is because the following file @babel/runtime ca ...

  9. (1.1)学习笔记之mysql体系结构(内存、进程、线程)

    关键词:mysql体系结构 参考:https://www.cnblogs.com/zhoubaojian/articles/7866292.html 一.mysql体系架构概述 1.mysql体系结构 ...

  10. spark复习总结02

    1.spark执行原理图 spark程序启动后创建sparkContext作为程序的入口,sparkContext可以与不同类的集群资源管理器(Cluster Manager)进行通信,从而获得程序运 ...