题目来源: CodeForces
基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题
 收藏
 取消关注

有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

之前的POJ 2796做过了之后,这个也就变得基础了。记录区间的长度,求区间的最小值,再从后往前,求最大值。

代码:

#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#pragma warning(disable:4996)
using namespace std; #define N 300001 int a[N], lef[N], stack[N], top;
long long sum[N],ans[N]; int main()
{
//freopen("i.txt", "r", stdin);
//freopen("o.txt", "w", stdout); int i, j, n, len;
int ll, rr; scanf("%d", &n);
memset(sum, 0, sizeof(sum));
for (i = 1; i <= n; i++)
{
scanf("%d", a + i);
sum[i] = sum[i - 1] + a[i];
}
++n;
fill(ans, ans + n, 0);
a[n] = -1;
top = 0;
for (i = 1; i <= n; i++)
{
if (i == n - 1)
{
i++;
i--;
}
//单调递减栈,从栈顶元素到栈底元素,值单调递减
if (top == 0 || a[i] > a[stack[top - 1]])//如果当前元素的值大于栈顶的值,就将元素的值插入到栈中
{
stack[top++] = i;
lef[i] = i;
continue;
}
if (a[i] == a[stack[top - 1]])
continue;
while (top >= 1 && a[i] < a[stack[top - 1]])//如果当前元素的值小于栈顶元素,那么这时总结计算值,可能会是最大值
{
--top; len = i - 1 - (lef[stack[top]] - 1);
if (a[stack[top]] > ans[len])
{
ll = lef[stack[top]];
rr = i - 1;
ans[len] = a[stack[top]];
}
}
lef[i] = lef[stack[top]];
stack[top++] = i;
} for (i = n - 1; i >= 1; i--)
{
ans[i] = max(ans[i], ans[i + 1]);
}
for (i = 1; i <= n - 1; i++)
{
if (i == 1)
{
printf("%lld", ans[i]);
}
else
{
printf(" %lld", ans[i]);
}
}
printf("\n");
//system("pause");
return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

51nod 1437:迈克步 单调栈基础题的更多相关文章

  1. 51nod 1437 迈克步 单调栈

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

  2. 51nod 1437 迈克步——单调栈

    有n只熊.他们站成一排队伍,从左到右依次1到n编号.第i只熊的高度是ai. 一组熊指的队伍中连续的一个子段.组的大小就是熊的数目.而组的力量就是这一组熊中最小的高度. 迈克想知道对于所有的组大小为x( ...

  3. [Usaco2006 Mar]Mooo 奶牛的歌声(单调栈裸题)

    1657: [Usaco2006 Mar]Mooo 奶牛的歌声 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 961  Solved: 679[Submi ...

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

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

  5. poj3250(单调栈模板题)

    题目链接:https://vjudge.net/problem/POJ-3250 题意:求序列中每个点右边第一个>=自身的点的下标. 思路:简单介绍单调栈,主要用来求向左/右第一个小于/大于自身 ...

  6. poj2559/hdu1506 单调栈经典题

    我实在是太菜了啊啊啊啊啊 到现在连个单调栈都不会啊啊啊 写个经典题 #include<cstdio> #include<algorithm> #include<cstri ...

  7. BZOJ1113 海报PLA1(单调栈入门题)

    一,自己思考下 1,先自己思考下 N个矩形,排成一排,现在希望用尽量少的海报去cover住它们. 2,不懂. 着实不懂. 3,分析下,最优性问题对吧,然后就每什么想法了.. 虽然肯定和单调栈和单调队列 ...

  8. POJ 2796:Feel Good 单调栈经典题

    Feel Good Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 11626   Accepted: 3212 Case T ...

  9. Bad Hair Day POJ - 3250 (单调栈入门题)

    Some of Farmer John's N cows (1 ≤ N ≤ 80,000) are having a bad hair day! Since each cow is self-cons ...

随机推荐

  1. SRS源码——Listener

    1. 整理了一下Listener相关的UML类图:

  2. mysql 获取刚插入行id汇总

    mysql 获取刚插入行id汇总 我们在写数据库程序的时候,经常会需要获取某个表中的最大序号数, 一般情况下获取刚插入的数据的id,使用select max(id) from table 是可以的.但 ...

  3. unity优化-CPU(网上整理)

    CPU方面性能考虑:引擎和代码渲染模块.动画模块.物理模块.ui模块.粒子模块.加载模块.GC模块最重要的是渲染模块.UI模块和加载模块1.渲染模块主要是:场景.物体和特效的渲染a.降低Draw ca ...

  4. 使用element-ui组件el-table时需要修改某一行或列的样式(包含解决选择器无效问题)

    在后台管理系统项目中,经常会使用element-ui中的组件el-table(表格)来展示列表数据. 当展示数据的时候,可能就需要给给某一行或者列设置特殊的样式,在查询文档是我遇到了一些问题:包括设置 ...

  5. 《React后台管理系统实战 :三》header组件:页面排版、天气请求接口及页面调用、时间格式化及使用定时器、退出函数

    一.布局及排版 1.布局src/pages/admin/header/index.jsx import React,{Component} from 'react' import './header. ...

  6. ubuntu18.04调整终端字体大小

    一.在终端内右键->Preferences. 二.选中Custom font,然后点击旁边的Monospace Regular 20. 三.在该界面可以选择字体类型,右下角可以调整字体大小.

  7. 33 第一个只出现一次的字符+ASCII码

    题目描述 在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置 思路:使用一个hashmap遍历一遍,统计每个字符出现的次数,然后再统 ...

  8. 2019护网杯baby_forensic

    题目名称:baby_forensic题目描述:can you catch the flag?附件:“data.7z” 2019护网杯初赛的一道取证题,比赛时没做出来,赛后又研究了一下. 获取profi ...

  9. MySQL复制(一)--复制概述

    MySQL复制(replication)文档集合:1.复制概述2.基于二进制日志文件位置(binlog)配置复制3.基于全局事物标识符(GTID)配置复制4.多源复制5.级联复制6.半同步复制7.延迟 ...

  10. 刷题20. Valid Parentheses

    一.题目说明 这个题目是20. Valid Parentheses,简单来说就是括号匹配.在学数据结构的时候,用栈可以解决.题目难度是Medium. 二.我的解答 栈涉及的内容不多,push.pop. ...