Cod sursa(job #1836399)

Utilizator stefanstan24Stan Stefan stefanstan24 Data 28 decembrie 2016 12:45:37
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.02 kb
#include <fstream>
using namespace std;

ifstream fin ( "scmax.in" );
ofstream fout ( "scmax.out" );

const int MAX_N=1+100000;

int N;
int a[ MAX_N ];/* DATELE DE INTRARE*/

int indice[ MAX_N ];
int indice_anterior[ MAX_N ];
int solutie[ MAX_N ];
int lungime;/* Datele folosite in algoritm*/

int  read_input() {
    /* citim datele de intrare */
    fin >> N;

    for( int i = 1; i <= N; i++)
    {

        fin >> a[i];

    }

}

int caut_binara ( int i)
{
    int stanga = 1, dreapta = lungime, solutie = 0;

    while(stanga <= dreapta)
    {
        int mijloc = (stanga + dreapta) / 2;

        if(a[i] > a[indice[mijloc]])
        {
            solutie = mijloc;
            stanga = mijloc + 1;
        }
        else
        {
            dreapta = mijloc - 1;
        }
    }

    return solutie + 1;
}

int construire_vector_dinamic( )
{
    indice[1] = 1; lungime = 1;

    for(int i = 2; i <= N; i++)

    {
        //fout << lungime << '\n';
        if(a[i] > a[indice[lungime]])/* daca elementul curent e mai mare decat ultimul element al subsirului, il putem adauga la capat */
        {
                ++lungime;
            indice[lungime] = i;
         indice_anterior[i] = indice[lungime - 1];

        }
        else /* cautam o pozitie pe care sa adaugam elementul curent ca sa optimizam sirul */
        {

        int pozitie = caut_binara(i);
            indice[pozitie] = i;
            indice_anterior[i] = indice[pozitie - 1];

        }

    }

}


int obtine_solutia()
{
    int pozitie = lungime, i = indice[lungime];

    while(i > 0)

    {

        solutie[pozitie] = a[i];
        i = indice_anterior[i];
        pozitie --;

    }

}

 int afiseaza_solutia()
 {

    fout << lungime << '\n';

    for(int i = 1; i <= lungime; i++)
    {

        fout << solutie[i] << " ";
    }

 }

int main()
{
    read_input();
    construire_vector_dinamic();
    obtine_solutia();
    afiseaza_solutia();
    return 0;

}