Cod sursa(job #2167641)

Utilizator flaviu_2001Craciun Ioan-Flaviu flaviu_2001 Data 13 martie 2018 22:39:49
Problema Subsir crescator maximal Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <bits/stdc++.h>

using namespace std;

const int nmax = 100005;
int n;
int e[nmax], len[nmax], v[nmax], m[nmax], nr;
vector<int> sol;

int bin(int x)
{
    int st = 0, dr = nr, mid;
    for (mid = (st+dr)/2; st <= dr; mid = (st+dr)/2)
        if(v[m[mid]] < x && v[m[mid+1]] >= x)
            return mid;
        else if (v[m[mid]] < x)
            st = mid+1;
        else dr = mid-1;
    return nr;
}

int main()
{
    ifstream fin ("scmax.in");
    ofstream fout ("scmax.out");
    fin >> n;
    for (int i = 1; i <= n; ++i)
        fin >> v[i];
    for (int i = 1; i <= n; ++i){
        int pos = bin(v[i]);
        if(pos == nr)
            ++nr;
        e[i] = m[pos]; //e retine care e indicele pe ce indice se duce termenul anterior din solutia cu lungime pos+1 curenta
        m[pos+1] = i; //m retine indicele ultimului element din lista de lungime x
    }
    int k = m[nr];
    for (int i = 1; i <= nr; ++i){
        sol.push_back(v[k]);
        k = e[k];
    }
    fout << nr << "\n";
    //for (int i = sol.size()-1; i >= 0; --i)
        //fout << sol[i] << " ";
    for (int i = 1; i <= nr; ++i)
        fout << v[m[i]] << " ";
    return 0;
}