Link


从右往左处理一个递减的单调栈,然后对比当前位置和栈顶,处理,处理后的栈顶即是此位置可以眺望到的第一个cow?
#include<cstdio>
int n,h[100001],bianhao[100001],st[100001],ans[100001],t;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d",&h[i]);
bianhao[1]=n;st[1]=h[n];t=1; //先把右边第一个存入栈
ans[n]=0;
for(int i=n-1;i;--i){ //依次处理
while(h[i]>=st[t]&&t>0) --t; //往前删
ans[i]=bianhao[t]; //记录
++t; //加入
st[t]=h[i];
bianhao[t]=i;
}
for(int i=1;i<=n;++i)
printf("%d\n",ans[i]);
}