向右看齐
luogu 2947
题目大意:
有n头奶牛,它们各有各的高度,现在要求出每一头奶牛右边第一头比他高的奶牛是那一头
输入样例
6
3
2
6
1
1
2
输出样例
3
3
0
6
6
0
输入说明
6 头奶牛的身高分别为 3, 2, 6, 1, 1, 2.
输出说明
奶牛#1,#2 仰望奶牛#3,奶牛#4,#5 仰望奶牛#6,奶牛#3 和#6 没有仰望对象。
数据范围
对于 20%的数据: 1≤N≤10;1≤N≤10;1≤N≤10;
对于 50%的数据:1≤N≤1,000;1≤N≤1,000;1≤N≤1,000;
对于 100%的数据:1≤N≤100,000;1≤Hi≤1,000,000;1≤N≤100,000;1≤H_i≤1,000,000;1≤N≤100,000;1≤Hi≤1,000,000;
解题思路:
我们可以建一个单调不上升的栈,然后每一次遇到比栈顶元素大的数时,把比这个数小的数弹出去,并记录下这个数,然后这个数入栈,每一次这样循环,就可以求出答案
代码:
#include<cstdio>
using namespace std;
int n,x,top,s[100500],w[100500],ans[100500];
int main()
{scanf("%d",&n);for (int i=1;i<=n;++i){scanf("%d",&x);while(s[top]<x&&top)//小于这个数的数{ans[w[top]]=i;//记录top--;//弹出}s[++top]=x;//入栈w[top]=i;//记录位置}for (int i=1;i<=n;++i)printf("%d\n",ans[i]);//输出
}