洛谷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";
}

浙公网安备 33010602011771号