51nod 1437 迈克步——单调栈
有n只熊。他们站成一排队伍,从左到右依次1到n编号。第i只熊的高度是ai。
一组熊指的队伍中连续的一个子段。组的大小就是熊的数目。而组的力量就是这一组熊中最小的高度。
迈克想知道对于所有的组大小为x(1 ≤ x ≤ n)的,最大力量是多少。
单组测试数据。
第一行有一个整数n (1 ≤ n ≤ 2×10^5),表示熊的数目。
第二行包含n个整数以空格分开,a1, a2, ..., an (1 ≤ ai ≤ 10^9),表示熊的高度。
在一行中输出n个整数,对于x从1到n,输出组大小为x的最大力量。
10
1 2 3 4 5 4 3 2 1 6
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 迈克步——单调栈的更多相关文章
- 51nod 1437 迈克步 单调栈
利用单调栈高效的求出,一个数a[i]在哪个区间内可作为最小值存在. 正向扫描,求出a[i]可做为最小值的区间的左边界 反向扫描,求出a[i]可作为最小值的区间的右边界 r[i] - l[i] +1 就 ...
- 51nod 1437 迈克步(单调栈)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1437 题意: 思路: 单调栈题.求出以每个数为区间最大值的区间范围即可. ...
- 51nod 1437:迈克步 单调栈基础题
1437 迈克步 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 取消关注 有n只熊.他们站成一排队伍,从左到右依次1到 ...
- 51nod 1437 迈克步
题目链接 先利用单调栈or其他方法找到一个元素g[i]作为最小值的区间,设为[L, R]. 那么长度为R-L+1的组的最大值ans=max(ans,g[i]).但是有一个问题: 比如6这个元素是长度为 ...
- 51nod1437 迈克步 单调栈
考虑一个点作为最小值的区间$[L[i], R[i]]$ 那么这个区间的所有含$i$的子区间最小值都是$v[i]$ 因此,用单调栈求出$L[i], R[i]$后,对$R[i] - L[i] + 1$这个 ...
- 51nod 1102 【单调栈】
思路: 对于这个高度往左能延伸最远x,往右能延伸最远y,(x+1+y)*w; 利用单调栈就行了: #include <cstdio> #include <stack> #inc ...
- 51nod 1102 面积最大的矩形 (单调栈)
链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1102 思路: 首先介绍下单调栈的功能:利用单调栈,可以找到从左/ ...
- 51nod 1102 面积最大的矩形(单调栈)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1102 题意: 思路: 做法就是求出每个长方形向左向右所能延伸的最大距离. ...
- 51nod 1215 单调栈/迭代
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1215 1215 数组的宽度 题目来源: Javaman 基准时间限制:1 ...
随机推荐
- delphi 动态获取文件类型的图标
delphi 动态获取文件类型的图标.txt我不奢望什么,只希望你以后的女人一个不如一个.真怀念小时候啊,天热的时候我也可以像男人一样光膀子!在应用程序的编写中,组合框(ComboBox).列表框(L ...
- 对于页面上下载pdf或者excel按钮的实现
这个主要是通过 window.open(url + params) url后台给存放的路径,params是参数
- [CSP-S模拟测试]:影子(并查集+LCA)
题目描述 一个人有很多的影子,新的旧的,他们不断消失重来.学者的影子在他苍白色的精神图景里成为了$n$个黑色的点,他们伸长的触手交叉形成了一颗黑色的树.假使每个影子点拥有一个权值$d_i$,黑色的树边 ...
- express设置允许跨域访问该服务.
const express = require('express');const app = express(); //设置允许跨域访问该服务.app.all('*', function (req, ...
- mysql全家桶(二)数据操作
一.数据操作1.增#新增insert into 表名(字段列表) values(值列表);INSERT INTO table_name ( field1, field2,...fieldN ) VAL ...
- 【数据库】一篇文章搞掂:SQL Server数据库
问题: 1.同一段代码,在存储过程中运行比普通SQL执行速度慢几十倍 原理: 在SQL Server中有一个叫做 “Parameter sniffing”参数嗅探的特性.SQL Server在存储过程 ...
- CJE-Jenkins认证工程师备考指南1-考试简介
CloudBees公司提供两项认证 Jenkins工程师(CJE)考试 包括60个选择题 测试开源Jenkins的知识. CloudBees 平台工程师(CCJE)考试 包含90个问题: 60个问题测 ...
- bat 笔记
cmd删除非空文件夹 rd+空格+/s/q+空格+d:\filedir for语句的基本用法 在批处理文件中: FOR %%variable IN (command1) DO command2 [co ...
- C++异常处理try、catch 没有finally
程序的错误大致可以分为三种,分别是语法错误.逻辑错误和运行时错误: 1) 语法错误在编译和链接阶段就能发现,只有 100% 符合语法规则的代码才能生成可执行程序.语法错误是最容易发现.最容易定位.最容 ...
- .net报错大全
1.未能加载文件或程序集“Newtonsoft.Json, Version=4.5.0.0"[已解决] 解决方案:https://blog.csdn.net/mzl87/article/de ...