洛谷P2947-Look up S

洛谷P2947-Look up S

题目大意

​ 有n头牛,每头牛向右边看,问每头牛看到的第一个比他自己高的牛的位置是什么。

思路

​ 因为每头牛是向右边找第一个比他高的,所以在他右边所有的小于等于他的都可以丢掉。

​ 利用单调栈的的性质,做一个栈顶到栈底升序的单调栈。并且从后往前遍历。

​ 这两题是一样的>戳我<

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int N = 2*1e6+10;

ll ans[N] ;
ll n , num = 1;

int main(){
	ios::sync_with_stdio(false);
	cin>>n;
	for(ll i = 1 ; i <= n ; i ++){
		cin>>a[i].h; a[i].idx = i ;
	}

	ll i = 1 ,  j = 1 ;
	st[1] = a[n];
	ans[n] = 0 ;
	
	for(ll i = n - 1 ; i > 0 ; i -- ){
		while(num && st[num].h <= a[i].h)num -- ;
		if(num)ans[i] = st[num].idx ;
		else ans[i] = 0 ;
		st[++num] = a[i] ;
	}
	
	for(ll i = 1 ; i <= n ; i ++)
	cout<<ans[i]<<"\n";
	
}
posted @ 2021-09-05 19:56  tyrii  阅读(117)  评论(0)    收藏  举报