题目链接:https://www.luogu.com.cn/problem/P5788
单调队列的模板,所以两种方式,直接用 STL stack 或者手搓栈
①以下是 STL stack 代码
#include <iostream>
#include <stack>
using namespace std;
long long h[ 3000010 ], ans[ 3000010 ];
int main ( )
{
long long n, i;
scanf ( "%lld", &n );
for ( i = 1; i <= n; ++ i )
{
scanf ( "%lld", &h[ i ] );
}
stack<int> st;
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 ( "%lld ", ans[ i ] );
}
return 0;
}
②以下是手搓栈的代码
#include <iostream>
using namespace std;
const int N = 3000010;
struct mystack
{
long long a[ N ];
long long t = 0;
void push ( long long x )
{
a[ ++ t ] = x;
}
void pop ( )
{
-- t;
}
long long top ( )
{
return a[ t ];
}
long long empty ( )
{
return t == 0 ? 1 : 0;
}
}st;
long long h[ N ], ans[ N ];
int main( )
{
long long n, i;
scanf ( "%lld", &n );
for ( i = 1; i <= n; ++ i )
{
scanf ( "%lld", &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 ( "%lld ", ans[ i ] );
}
return 0;
}