Cod sursa(job #1996920)

Utilizator xtreme77Patrick Sava xtreme77 Data 2 iulie 2017 22:52:01
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>
#include <vector>

using namespace std ;

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

int get (int value, int len, vector <int> &v, vector <int> &partial) {
    int st = 0 ;
    int dr = len ;
    int sol = 1 ;
    while (st <= dr) {
        int mij = (st + dr) >> 1 ;
        if (v[partial[mij]] < value) {
            sol = mij ;
            st = mij + 1 ;
        }
        else {
            dr = mij - 1 ;
        }
    }
    return sol ;
}

void rec (int poz, vector <int> &prev, vector <int> &v) {
    if (poz == 0) {
        return ;
    }
    rec (prev [poz], prev, v) ;
    cout << v [poz] << ' ' ;
}

int main () {
    int n ;
    cin >> n ;
    vector <int> v (n + 1, 0) ;
    for (int i = 1 ; i <= n ; ++ i) {
        cin >> v [i] ;
    }
    vector <int> dp (n + 1) ;
    vector <int> prev (n + 1) ;
    vector <int> partial (n + 1) ;
    dp [1] = 1 ;
    prev [1] = 0 ;
    partial [1] = 1 ;
    int inserted = 1 ;
    int best = 1 ;
    for (int i = 2 ; i <= n ; ++ i) {
        int insertion_pos = get (v[i], inserted, v, partial) ;
        partial [insertion_pos + 1] = i ;
        dp [i] = insertion_pos + 1 ;
        prev [i] = partial [insertion_pos] ;
        if (inserted < insertion_pos + 1) {
            inserted = insertion_pos + 1 ;
        }
        best = max (best, dp [i]) ;
    }
    cout << best << '\n' ;
    for (int i = 1 ; i <= n ; ++ i) {
        if (dp [i] == best) {
            rec (i, prev, v) ;
            return 0 ;
        }
    }
}