题目
给出一个数列
A
A
,求出一个数列,其中
Bi
B
i
表示 数列
A
A
中 右边第一个比
Ai
A
i
大的数的下标(从1开始计数),没有找到这一个下标
Bi
B
i
就为0,输出数列
B
B
输入描述:
第一行1个数字 (
n
n
≤ 10000),第二行n个数字第 个数字为 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;
}