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

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

鉄則本 A24 - LIS (1Q, ★5)

LIS。鉄則本の問題なのでコードのみ。

問題概要

長さ  N の数列  A_{1}, A_{2}, \dots, A_{N} の LIS の長さを求めよ。

制約

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

コード

#include <bits/stdc++.h>
using namespace std;
const int INF = 1 << 29;

int main() {
    int N, res = 0;
    cin >> N;
    vector<int> A(N);
    for (int i = 0; i < N; i++) cin >> A[i];

    // dp[v] := A から長さ v の IS をとったときの、最終項の値の最小値
    vector<int> dp(N+1, INF);
    dp[0] = 0;
    for (int i = 0; i < N; i++) {
        int j = lower_bound(dp.begin(), dp.end(), A[i]) - dp.begin();
        dp[j] = A[i];
        res = max(res, j);
    }
    cout << res << endl;
}