シミュレーションの仕方を工夫する問題。数値ごとに index をまとめあげるデータを持つとうまくいく。
問題概要
長さ の正の整数列 が与えられる。
の順列 であって、
を満たすものを考える。そのような順列の (ただし である場合の の場合は除外) となっている箇所の個数の最小値を求めよ。
制約
考えたこと
本当に愚直にやると TLE になる。
ids[v]
←A[i] == v
となる indexi
の集合
というデータをもつと上手に処理できる。僕の実装だと、 として、計算量は となる。
コード
#include <bits/stdc++.h> using namespace std; const int MAX = 110000; int main() { vector<vector<int>> ids(MAX); // 入力 int N; cin >> N; vector<int> A(N); for (int i = 0; i < N; ++i) { cin >> A[i]; ids[A[i]].push_back(i); } int res = 0; int cur = 0; for (int v = 0; v < MAX; ++v) { if (ids[v].empty()) continue; int pl = lower_bound(ids[v].begin(), ids[v].end(), cur) - ids[v].begin(); if (cur > ids[v][0]) cur = ids[v].back(); else { ++res; cur = ids[v][pl-1]; } } if (cur > 0) ++res; cout << res << endl; }