けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

鉄則本 A60 - Stock Price (2Q, ★4)

スタックを用いて解決できる典型問題

問題概要

長さ  N の数列  A_{1}, A_{2}, \dots, A_{N} が与えられる。

 d = 1, 2, \dots, N に対して、 j \lt d かつ  A_{j} \gt A_{d} を満たす最大の  j を求めよ (存在しない場合は -1)。

制約

  •  1 \le N \le 2 \times 10^{5}

メモ

スタックを使うと  O(N) の計算量で解ける。詳細は鉄則本を参照。

コード

#include <bits/stdc++.h>
using namespace std;
using pint = pair<int,int>;

int main() {
    int N, A;
    cin >> N;

    vector<pint> stk;
    for (int i = 0; i < N; i++) {
        cin >> A;
        while (!stk.empty() && stk.back().first <= A) stk.pop_back();
        if (stk.empty()) cout << -1 << " ";
        else cout << stk.back().second+1 << " ";
        stk.emplace_back(A, i);
    }
    cout << endl;
}