向 右 看 齐 L o o k U p 向右看齐\ Look\ Up 向右看齐 Look Up
题目链接:luogu P2947
题目
约翰的 N ( 1 ≤ N ≤ 1 0 5 ) N(1≤N≤10^5) N(1≤N≤105)头奶牛站成一排,奶牛 i i i的身高是 H i ( l ≤ H i ≤ 1 , 000 , 000 ) H_i(l≤H_i≤1,000,000) Hi(l≤Hi≤1,000,000)。现在,每只奶牛都在向右看齐.对于奶牛 i i i,如果奶牛 j j j满足 i < j i<j i<j且 H i < H j H_i<H_j Hi<Hj,我们可以说奶牛 i i i可以仰望奶牛 j j j. 求出每只奶牛离她最近的仰望对象
输入
第 1 1 1 行输入 N N N,之后每行输入一个身高 H i H_i Hi。
输出
共 N N N 行,按顺序每行输出一只奶牛的最近仰望对象,如果没有仰望对象,输出 0 0 0。
样例输入
6
3
2
6
1
1
2
样例输出
3
3
0
6
6
0
样例解释
6
6
6 头奶牛的身高分别为
3
3
3,
2
2
2,
6
6
6,
1
1
1,
1
1
1,
2
2
2.
奶牛
1
1
1、
2
2
2 仰望奶牛
3
3
3,奶牛
4
4
4、
5
5
5 仰望奶牛
6
6
6,奶牛
3
3
3 和
6
6
6 没有仰望对象。
数据范围
对于
20
%
20\%
20%的数据:
1
≤
N
≤
10
1≤N≤10
1≤N≤10;
对于
50
%
50\%
50%的数据:
1
≤
N
≤
1
,
000
1≤N≤1,000
1≤N≤1,000;
对于
100
%
100\%
100%的数据:
1
≤
N
≤
100
,
000
1≤N≤100,000
1≤N≤100,000;
1
≤
H
i
≤
1
,
000
,
000
1≤H_i≤1,000,000
1≤Hi≤1,000,000;
思路
这道题就是一道单调栈。
每次读入时就判断判断是否会被仰望,(枚举每一次的栈顶,不会就退出,会就把那个数出栈),然后把读入的数进栈。
最后我们输出所记录的仰望对象,就可以了。
代码
#include<cstdio>
using namespace std;
int n,a,ans[100001],num;
struct note
{
int num,tall;
}f[100001];
int main()
{
scanf("%d",&n);//读入
num=1;//初始化
for (int i=1;i<=n;i++)
{
scanf("%d",&a);//读入
while (a>f[num-1].tall&&num>1)
{
ans[f[num-1].num]=i;//找仰望对象
num--;//出栈
}
f[num++]=(note){i,a};//入栈
}
for (int i=1;i<=n;i++)
printf("%d\n",ans[i]);//输出
return 0;
}