Description
约翰的N(1≤N≤105)头奶牛站成一排,奶牛i的身高是Hi(l≤Hi≤1,000,000).现在,每只奶牛都在向左看齐.对于奶牛i,如果奶牛j满足i<j且Hi<Hj,我们可以说奶牛i可以仰望奶牛j. 求出每只奶牛离她最近的仰望对象.
Input
第1行输入N,之后每行输入一个身高.
Output
共N行,按顺序每行输出一只奶牛的最近仰望对象.如果没有仰望对象,输出0.
Sample Input
6
3
2
6
1
1
2
3
2
6
1
1
2
Sample Output
3
3
0
6
6
0
3
0
6
6
0
离线反向做单调栈,一直删掉栈头的数以后剩下的就是第一个比它大的
#include<cstdio> #include<iostream> using namespace std; inline int read() { int x=0,f=1;char ch=getchar(); while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int n,top; int a[100002]; int ans[100002]; int zhan[100002]; int from[100002]; int main() { n=read(); for (int i=1;i<=n;i++)a[i]=read(); for (int i=n;i>=1;i--) { while (top&&zhan[top]<=a[i]) top--; if (top) ans[i]=from[top]; zhan[++top]=a[i];from[top]=i; } for (int i=1;i<=n;i++) printf("%d ",ans[i]); }