题意:从首位开始,找到在其后的最近的每一位的比它大的数;
解析;
使用栈(stack)进行存储满足条件的值;从最后一个数进行入栈,当栈顶数大于当前位置时跳出此时循环(即证明,在当前位置后有至少一个比它大的数,而栈顶的值是最近的),否则进行出栈(即此时栈内值小于当前位置,当最后栈为空时,代表在当前位置后没有比它大的值,所以当前位置的值为0),最后将此时位置的值压入栈底;执行到最后,即刻筛出满足题意所有的值;
#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;
typedef long long LL;
const int maxn = 1000005;
LL num[ maxn ];
int main(){
int n, temp;
while( scanf( "%d", &n ) != EOF ){
stack< int > Q;
for( int i = 1; i <= n; ++i ){
scanf( "%lld", &num[ i ] );
}
for( int i = n; i > 0; --i ){
temp = num[ i ];
while( !Q.empty() && Q.top() <= num[ i ] )
Q.pop();
if( Q.empty() )
num[ i ] = 0;
else
num[ i ] = Q.top();
Q.push( temp );
}
for( int i = 1; i <= n; ++i )
printf( "%lld\n", num[ i ] );
}
}