Cod sursa(job #3308710)

Utilizator razvanmrt_06Mariuta Razvan razvanmrt_06 Data 27 august 2025 14:54:41
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <iostream>
#include <fstream>

using namespace std;

const int Nmax = 100005;

int n, v[Nmax], dp[Nmax], minVal[Nmax], len, sol[Nmax];
// dp[i] = lungimea  scmax care se termina pe pozitia i
// minVal[l] = valoarea minima a unei secvente crescatoare de lungime l

int binSearch(int val){
    int st = 1, dr = len;
    int rez = 0;
    while(st <= dr){
        int mij = (st + dr) / 2;
        if(minVal[mij] >= val){
            rez = mij;
            dr = mij-1;
        }
        else{
            st = mij+1;
        }
    }
    return rez;
}

int main(){
    ifstream fin("scmax.in");
    ofstream fout("scmax.out");
    fin >> n;
    for(int i = 1; i <= n; i++){
        fin >> v[i];
    }
    dp[1] = 1;
    minVal[1] = v[1];
    len = 1;   // lungimea lui len[]

    for(int i = 2; i <= n; i++){
        if(v[i] > minVal[len]){
            minVal[++len] = v[i];
            dp[i] = len;
        }
        else{
            int poz = binSearch(v[i]);   // poz primului elem >= v[i] din vectorul minVal
            minVal[poz] = v[i];
            dp[i] = poz;
        }
    }

    fout << len << "\n";

    int i = len;
    int j = n;
    while(i > 0 && j > 0){
        if(dp[j] == i){
            sol[i--] = v[j];
        }
        j--;
    }
    for(int i = 1; i <= len; i++){
        fout << sol[i] << " ";
    }

    return 0;
}