Cod sursa(job #2255738)

Utilizator caesar2001Stoica Alexandru caesar2001 Data 7 octombrie 2018 15:24:20
Problema Subsir crescator maximal Scor 95
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");

const int NMAX = 100005;

int dp[NMAX], v[NMAX], pos[NMAX], best[NMAX];

int main() {
    int n;
    in >> n;
    for(int i = 1; i <= n; i ++)
        in >> v[i];
    for(int i = 2; i <= n; i ++)
        dp[i] = INT_MAX;

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

    int sol;
    for(sol = n; sol >= 1 && dp[sol] == INT_MAX; sol --);
    out << sol << "\n";

    int i = n, last = n + 1;
    v[n + 1] = INT_MAX;
    vector<int> aux(sol, 0);
    while(sol) {
        if(best[i] == sol && v[i] < v[last]) {
            sol--;
            aux[sol] = v[i];
            last = i;
        }
        i --;
    }
    for(auto it : aux)
        out << it << " ";
    return 0;
}