牛客OI赛制测试赛2.C

33 篇文章 0 订阅
18 篇文章 0 订阅

题目

给出一个数列 A A ,求出一个数列B,其中 Bi B i 表示 数列 A A Ai 右边第一个比 Ai A i 大的数的下标(从1开始计数),没有找到这一个下标 Bi B i 就为0,输出数列 B B
输入描述:
第一行1个数字 n( n n ≤ 10000),第二行n个数字第 i 个数字为 Ai (0 ≤ Ai A i ≤ 1000000000)
输出描述:
一共一行,第 i i 个数和第 i+1 i + 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、付费专栏及课程。

余额充值