Cod sursa(job #2371204)

Utilizator caesar2001Stoica Alexandru caesar2001 Data 6 martie 2019 16:41:49
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <utility>
#include <cmath>
#include <string>
#include <cstring>
#include <set>
#include <queue>
#include <map>
#include <stack>
#define ll long long

using namespace std;

ifstream in("scmax.in");
ofstream out("scmax.out");

const int INF = 2000000005;

int main() {

    int n;
    in >> n;
    vector<int> v(n + 1, 0);
    for(int i = 1; i <= n; i ++)
        in >> v[i];

    vector<int> dp(n + 1, INF);
    vector<int> best(n + 1, 0);
    for(int i = 1; i <= n; i ++) {
        int ans = 0;
        for(int step = (1 << 16); step; step >>= 1)
            if(ans + step <= n && dp[ans + step] < v[i])
                ans += step;

        dp[ans + 1] = min(dp[ans + 1], v[i]);
        best[i] = max(best[i], ans + 1);
    }

    for(int i = n; i >= 1; i --) {
        if(dp[i] != INF) {
            out << i << "\n";

            vector<int> sol;
            int curr = i, last = INF;
            for(int j = n; j >= 1; j --) {
                if(curr > 0 && best[j] >= curr && v[j] < last) {
                    sol.push_back(v[j]);
                    last = v[j];
                    curr --;
                }
            }
            reverse(sol.begin(), sol.end());
            for(auto it : sol)
                out << it << " ";

            break;
        }
    }

    return 0;
}