Fu_L's Library

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub Fu-L/cp-library

:heavy_check_mark: verify/library_checker/other/longest_increasing_sequence.test.cpp

Depends on

Code

#define PROBLEM "https://judge.yosupo.jp/problem/longest_increasing_subsequence"
#include "../../../src/template/template.hpp"
#include "../../../src/dp/longest_increasing_sequence.hpp"
int main(void) {
    int n;
    cin >> n;
    vector<int> a(n);
    rep(i, 0, n) cin >> a[i];
    vector<int> lis = longest_increasing_sequence(a);
    cout << lis.size() << '\n';
    rep(i, 0, (int)lis.size()) cout << lis[i] << " \n"[i + 1 == (int)lis.size()];
}
#line 1 "verify/library_checker/other/longest_increasing_sequence.test.cpp"
#define PROBLEM "https://judge.yosupo.jp/problem/longest_increasing_subsequence"
#line 2 "src/template/template.hpp"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using P = pair<long long, long long>;
#define rep(i, a, b) for(long long i = (a); i < (b); ++i)
#define rrep(i, a, b) for(long long i = (a); i >= (b); --i)
constexpr long long inf = 4e18;
struct SetupIO {
    SetupIO() {
        ios::sync_with_stdio(0);
        cin.tie(0);
        cout << fixed << setprecision(30);
    }
} setup_io;
#line 3 "src/dp/longest_increasing_sequence.hpp"
template <typename T>
vector<int> longest_increasing_sequence(const vector<T>& a) {
    const int n = a.size();
    vector<pair<T, int>> dp;
    vector<int> p(n, -1);
    for(int i = 0; i < n; ++i) {
        auto it = lower_bound(begin(dp), end(dp), make_pair(a[i], -i));
        if(it != begin(dp)) p[i] = -prev(it)->second;
        if(it == end(dp)) {
            dp.emplace_back(a[i], -i);
        } else {
            *it = make_pair(a[i], -i);
        }
    }
    vector<int> res;
    for(int i = -dp.back().second; i != -1; i = p[i]) res.push_back(i);
    reverse(begin(res), end(res));
    return res;
}
#line 4 "verify/library_checker/other/longest_increasing_sequence.test.cpp"
int main(void) {
    int n;
    cin >> n;
    vector<int> a(n);
    rep(i, 0, n) cin >> a[i];
    vector<int> lis = longest_increasing_sequence(a);
    cout << lis.size() << '\n';
    rep(i, 0, (int)lis.size()) cout << lis[i] << " \n"[i + 1 == (int)lis.size()];
}
Back to top page