题目链接:https://www.luogu.com.cn/problem/P2947
这里可以运用单调栈,STL 或者手写
①以下是STL
#include <iostream>
#include <stack>
using namespace std;
int h[ 100001 ], ans[ 100001 ];
int main ( )
{
int n, i;
scanf ( "%d", &n );
for ( i = 1; i <= n; ++ i )
{
scanf ( "%d", &h[ i ] );
}
stack<int> st;
for ( i = n; i >= 1; -- i )
{
while ( !st.empty( ) && h[ st.top( ) ] <= h[ i ] )
{
st.pop( ); //栈顶奶牛没有 i 高,弹出它,直到栈顶奶牛更高为止
}
if ( st.empty ( ) ) //栈空,没有仰望对象
{
ans[ i ] = 0;
}
else
{
ans[ i ] = st.top( ); //栈顶奶牛更高,是仰望对象
}
st.push ( i ); //进栈
}
for ( i = 1; i <= n; ++ i )
{
printf ( "%d\n", ans[ i ] );
}
return 0;
}
②以下是手写栈
#include <iostream>
using namespace std;
const int N = 100100;
struct mystack
{
int a[ N ]; //存放栈元素,int型
int t = 0; //栈顶位置
void push ( int x ) //送入栈
{
a[ ++ t ] = x;
}
int top ( ) //返回栈顶元素
{
return a[ t ];
}
void pop ( ) //弹出栈顶
{
-- t;
}
int empty ( ) //返回 1 表示空
{
return t == 0 ? 1 : 0;
}
}st;
int h[ N ], ans[ N ];
int main ( )
{
int n, i;
scanf ( "%d", &n );
for ( i = 1; i <= n; ++ i )
{
scanf ( "%d", &h[ i ] );
}
for ( i = n; i >= 1; -- i )
{
while ( !st.empty ( ) && h[ st.top() ] <= h[ i ] )
{
st.pop( ); //栈顶元素没有当前奶牛高,弹出它
}
if ( st.empty ( ) )
{
ans[ i ] = 0; //栈空,没有奶牛比当前奶牛高
}
else
{
ans[ i ] = st.top ( ); //栈顶元素比当前奶牛高,是仰望对象
}
st.push ( i );
}
for ( i = 1; i <= n; ++ i )
{
printf ( "%d\n", ans[ i ] );
}
return 0;
}