对题目先暴力:
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; }