給定陣列a[n],對於每個元素a[i],求後面第1個比它大的元素的下標,如果不存在,則用0表示。
1<=n<=3e6; 1<=a[i]<=1e9
單調棧和單調佇列都是類似的套路,先迴圈把容器中不符合條件的元素彈出,然後更新答案,再將元素入隊。
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=b;i>=a;i--)
const int N = 3000005;
int n, a[N], ans[N];
void solve() {
cin >> n;
rep(i,1,n) cin >> a[i];
vector<int> s;
per(i,1,n) {
while (!s.empty() && a[i] >= a[s.back()])
s.pop_back();
ans[i] = s.empty() ? 0 : s.back();
s.push_back(i);
}
rep(i,1,n) cout << ans[i] << " ";
}
signed main() {
cin.tie(0)->sync_with_stdio(0);
int t = 1;
while (t--) solve();
return 0;
}