利用栈来操作,如果当前入栈的元素比栈顶元素大,那这个元素就是栈顶元素右边第一个比栈顶元素大的元素。如果当前元素比栈顶元素小。或者栈为空,那当前元素入栈。

#include<iostream>
#include<stack>
#include<vector>
using namespace std;

const int MAXN = 1e6+10;
int arr[MAXN];
int ans[MAXN];
int main()
{
    int N;
    cin >> N;
    for(int i = 0 ; i < N ; i++)
    {
        cin >>arr[i];
        ans[i]=-1;
    }
    stack<vector<int> > s;
    for(int i = 0 ; i < N ; i++)
    {
        vector<int> t;
        if(!s.empty())
        {
            while(!s.empty()&&arr[s.top()[0]]<arr[i]){//如果当前元素比栈顶大,那么给栈顶元素记上答案,然后出栈
                for(int j = 0 ; j < s.top().size() ; j++){ans[s.top()[j]] = i-s.top()[j];}
                s.pop();
            }
            if(s.empty()){
                t.push_back(i);
                s.push(t);
                continue;
            }
            if(arr[s.top()[0]] == arr[i]){s.top().push_back(i);}
            if(arr[s.top()[0]] > arr[i]){
                t.push_back(i);
                s.push(t);
            }
        }
        else{
            t.push_back(i);
            s.push(t);
        }
    }
    for(int i = 0 ;i < N ; i++)
    {
        cout<<ans[i]<<endl;
    }
    return 0;
}