题目描述
题解
单调栈裸题。
维护单调递减的栈,每一个点的右边只会被第一个 比它大的点更新。
代码
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define N 100005
int n,top;
int stack[N],h[N],r[N];
void push(int x)
{
while (top&&h[stack[top]]<h[x])
{
r[stack[top-1]]=r[stack[top]];
--top;
}
stack[++top]=x;
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;++i) scanf("%d",&h[i]),r[i]=i;
for (int i=1;i<=n;++i) push(i);
while (top)
{
r[stack[top-1]]=r[stack[top]];
--top;
}
for (int i=1;i<=n;++i)
{
if (r[i]!=n) printf("%d\n",r[i]+1);
else puts("0");
}
}