Cod sursa(job #3202083)

Utilizator vvvvvvvvvvvvvVusc David vvvvvvvvvvvvv Data 10 februarie 2024 17:03:13
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <fstream>
#include <algorithm>
#include <vector>

using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int NMAX = 1e6 + 1;
int n, v[NMAX], best[NMAX], last[NMAX], maxL, maxI, k, p[10], e;
vector<int> sol;

// int main(){
//     fin >> n;
//     for(int i = 1; i <= n; i++) fin >> v[i], best[i] = 1, last[i] = i;
//     for(int i = 1; i <= n; i++)
//         for(int j = 1; j <= i; j++)
//             if(v[j] < v[i] && best[j] + 1 > best[i]) {
//                 best[i] = best[j] + 1, last[i] = j;
//                 if(best[i] > maxL){
//                     maxL = best[i];
//                     maxI = i;
//                 }    
//             }
//     fout << maxL << '\n';
//     for(k = maxI; k != last[k]; k = last[k]) sol.push_back(v[k]);
//     sol.push_back(v[k]);
//     for(int i = sol.size() - 1; i >= 0; i--) fout << sol[i] << ' ';
//     return 0;
// }

int main(){
    fin >> n;
    for(int i = 1; i <= n; i++) fin >> v[i];
    sol.push_back(v[1]), p[1] = ++e;
    for(int i = 2; i <= n; i++){
        int x = v[i];
        if(sol.back() < x) sol.push_back(x), p[i] = ++e;
        else{
            int index = lower_bound(sol.begin(), sol.end(), x) - sol.begin();
            sol[index] = x;
            p[i] = index + 1;
        }
    }
    fout << sol.size() << endl;
    e = sol.size();
    sol.clear();
    for(int i = n; i > 0; i--) if(p[i] == e) sol.push_back(v[i]), e--;
    for(int i = sol.size() - 1; i >= 0; i--) fout << sol[i] << ' ';
    return 0;
}