对题目先暴力:
for循环每一点
for从该点往前找到比它小的点
可知:当i<j时,若a[ i ]>a[ j ]时a[ i ]不会是答案(因为后不满足,该前绝对不满足),所以要使序列删掉后不满足,该前绝对不满足 的情况,这样就形成了单调栈
是序列单调递增只样就能保证后面的不满足,前面所有都不确定
#include <bits/stdc++.h>
using namespace std;
const int N=100005;
int n,stk[N],idx,x;
int main() {
cin>>n;
idx=0;
while(n--){
scanf("%d",&x);
while(idx&&stk[idx]>=x) idx--;//向前找,直到找到头或者比它小的点
if(!idx) printf("-1 ");//如果到头
else printf("%d ",stk[idx]);//如果找到比它小的点
stk[++idx]=x;//因为它比它滤掉的点都小所以把滤掉的删掉
}
printf("\n");
return 0;
} 
京公网安备 11010502036488号