実行時間制限: 2 sec / メモリ制限: 1024 MB / Difficulty: 191
問題概要
長さ の正整数列 が与えられるので、以下で定義される長さ の数列 を求めよ。
- について、 と等しい要素が の直前に出現した位置を とする。そのような位置が存在しなければ とする。
制約
- 入力はすべて整数。
考察
定義通り を から順に増やしていき、 の値を確定させていけばよい。
工夫すべきなのはデータの持ち方、すなわち を満たす最大の の記憶方法である。 なので、普通にvector
を使うと MLE となってしまう。
そこで、key
をある値 、 value
を「 となる の中で最大のもの」とするような連想配列 (ここではlast_pos
とした) を用意する。その上で、以下のようなアルゴリズムにより解くことができる。
- を先頭から見ていく。
- 現時点で
last_pos
にkey
が含まれているとき- とする。
- そうでないとき
- とする。
コード
#include <bits/stdc++.h> using namespace std; #define rep(i, start, end) for (auto i = (start); (i) < (end); (i)++) // ======================================== // int main() { int N; cin >> N; vector<int> A(N); rep(i, 0, N) cin >> A[i]; vector<int> B(N, -1); unordered_map<int, int> last_pos; rep(i, 0, N) { if (last_pos.contains(A[i])) B[i] = last_pos[A[i]]; last_pos[A[i]] = i + 1; } rep(i, 0, N) cout << B[i] << " "; cout << endl; return 0; }
実装時間: 10分