[AtCoder] ABC 134 E – Sequence Decomposing
問題
方針
広義単調減少部分列
\( A_1 \geq A_2 \geq \cdots \geq A_i \) となるような広義単調減少列に対して、\( i \) 個の色が必要であることが分かります。これは、連続しない部分列に対しても言えるので、最長増加部分列を求めるようにして求めます。
コード
#include <bits/stdc++.h> using namespace std; typedef long long ll; int N; vector<int> A, L; // 広義単調減少部分列の長さ int solve(){ L[0] = A[0]; int length = 1; for (int i = 1; i < N; i++) { if (L[length - 1] <= A[i]) { L[length] = A[i]; length++; } else { auto iter = upper_bound(L.begin(), L.begin() + length, A[i]); L[iter - L.begin()] = A[i]; } } return length; } int main() { cin >> N; A.resize(N); L.resize(N); for (int i = 0; i < N; i++) { cin >> A[i]; A[i] = - A[i]; } cout << solve() << "\n"; return 0; }
ディスカッション
コメント一覧
まだ、コメントがありません