题目链接:【模板】单调栈 - 洛谷
这里把单调栈封装成了struct,用起来比较方便。
注意,根据不同的单调栈,init代码需要修改。
#include <bits/stdc++.h>
using namespace std;
#define FOR(i, a, b) for (int i = (a); i <= (b); i++)
#define int long long
#define pii pair<int,int>
const int N = 3e6+5, inf=1e18;
int n,a[N];
struct Monotone{
int l[N],r[N],q[N],cnt=0;
void init(int*a,int n){
a[0]=inf+1; //如果是求两边更小,a[0]=-inf-1
a[n+1]=inf; //如果是求两边更小,a[0]=-inf
FOR(i,0,n+1){
if(cnt==0) {q[++cnt]=i; continue;}
while(a[q[cnt]]<a[i]){ //如果是求两边更小,a[q[cnt]]>a[i]
r[q[cnt]]=i-1;
cnt--;
}
l[i]=q[cnt]+1;
q[++cnt]=i;
}
}
}d;
signed main(){
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin>>n; FOR(i,1,n) cin>>a[i]; d.init(a,n);
FOR(i,1,n) cout<<(d.r[i]==n ? 0 : d.r[i]+1)<<' ';
// FOR(i,1,n) cout<<d.l[i]<<' '<<d.r[i]<<endl;
}