A - Jumping Buildings Gym - 102302A(单调队列,找这个数右边第一个比他大的数)

Bob is developing a new game called jumping Lario. In this game the main protagonist, Lario, has to jump on top of buildings until he reaches the end of the level. The level is composed of N buildings of possibly different heights. The building where Lario starts is chosen randomly at the beginning of the game.

Bob started to write the code for his game but then realized that he didn’t know how to implement the jumps mechanics. The thing is, if Lario is currently on top of building X and the height of this building is h, then Lario should be able to reach building min(X + h, n) in one jump. Unless, of course, there’s a taller building somewhere on the path from building X to building X + h, then in this case, Lario would face smash the taller building on the path and end up landing right before it.

For example, in the image bellow, if Lario had started on the first building (of height 5), with one jump he should be able to reach building six. But on the path from building one to building six, he would end up hitting building five that has height 6. When doing so, he would land on building four (the one with height 3).

Given the heights for all the N buildings, your task is to figure out for every possible start position of Lario, how far he would be able to go with just one jump.

Input
The first line of the input contains a single integer N (1 ≤ N ≤ 105), indicating the number of buildings.

The second line of the input contains N integers h1, h2… hN (1 ≤ hi ≤ 105), indicating the height of each building.

Output
Output N integers. The i-th integer indicating the farthest building that Lario can reach with one jump if he starts on top of the i-th building.

Example
Input
6
5 2 2 3 6 2
Output
3 1 0 0 1 0

题意: 找这个数右边第一个比他大的数
思路: 单调队列一眼题,使其出队列的数就是这个最先比他大的数。

ps:又回顾了一下单调栈算法,貌似这个算法能算单调栈,也能算单调队列。换句话说,单调栈 == 单调队列。想想,单调栈和单调队列都是维护一个序列的单调性元素,说人话,里面存的东西都是单调的。典型的单调栈算法算矩形最大面积POJ2559,之所以维护单调性有用,是因为矩形面积的拓展区域,与左边第一个比他小的元素和右边第一个比他小的元素有关,维护的时候我们在出栈的时候才用长度进行了所谓的计算。

其实,进栈的时候,栈顶的元素,就是这个元素的左边界,出栈的时候,就是其右边界。和单调队列真没啥滴区别。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <set>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 7;
int q[maxn],a[maxn],ans[maxn];

int main()
{
    int n;scanf("%d",&n);
    for(int i = 1;i <= n;i++)
    {
        scanf("%d",&a[i]);
    }
    
    int h = 0,l = 0;
    for(int i = 1;i <= n;i++)
    {
        while(l > h && a[q[l]] < a[i])
        {
            ans[q[l]] = i;
            l--;
        }
        q[++l] = i;
    }
    
    for(int i = 1;i <= n;i++)
    {
        if(ans[i] == 0)
            ans[i] = n + 1;
    }
    for(int i = 1;i <= n;i++)
    {
        printf("%d ",min(a[i],ans[i] - i - 1));
    }
    return 0;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值