牛客OI赛制测试赛2.C

题目

给出一个数列 AA,求出一个数列B,其中BiBi 表示 数列AAAi 右边第一个比 AiAi 大的数的下标(从1开始计数),没有找到这一个下标 BiBi 就为0,输出数列BB
输入描述:
第一行1个数字 n(nn ≤ 10000),第二行n个数字第 i 个数字为 Ai (0 ≤ AiAi ≤ 1000000000)
输出描述:
一共一行,第 ii个数和第 i+1i+1 个数中间用空格隔开.
示例1
输入
6
3 2 6 1 1 2
输出
3 3 0 6 6 0

分析

这道题类似于单调栈,我们可以维护一个单调非严格下降的数列,当有数大于栈顶时,弹栈,并使此元素的ans是现在进行处理元素的编号,最后栈中剩下的ans是0.
上代码

#include<bits/stdc++.h>
using namespace std;
int al[10010],f[10010],n,sta[10010],h=0;;
int main(){
    scanf("%d%d",&n,&al[1]);
    sta[++h]=1;
    for(int i=2;i<=n;i++){
        scanf("%d",&al[i]);
        while((h)&&(al[sta[h]]<al[i]))
            f[sta[h]]=i,h--;
        sta[++h]=i;
    }
    for(int i=1;i<=n;i++)
        printf("%d ",f[i]);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值