题目
输入样例
8
73 74 75 71 69 72 76 73
输出样例
1 1 4 2 1 1 0 0
解题思路
就是一个单调栈的模板题
从后往前建立一个递减的单调栈
每次到一个新数时,将前面的比当前数小的数弹出,留下的栈顶就是后面第一个比当前数大的数
Code
#include <bits/stdc++.h>
#define N 3000010
#define ll long long
using namespace std;
ll n, top, a[N], q[N], ans[N];
int main() {
scanf("%lld", &n);
for(int i = 1; i <= n; i ++)
scanf("%lld", &a[i]);
q[++ top] = n;
for(int i = n - 1; i; i --) {
while(top && a[q[top]] <= a[i]) top --;
if(top) ans[i] = q[top] - i;
q[++ top] = i;
}
for(int i = 1; i <= n; i ++)
printf("%lld ", ans[i]);
}