Cod sursa(job #1755310)

Utilizator enacheionutEnache Ionut enacheionut Data 9 septembrie 2016 20:16:25
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.48 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <list>

#define DIMENSIUNE_MAXIMA_SIR 100005

using namespace std;

int dimensiuneSirNumere;
int dimensiuneSubsirCrescatorMaximal;
int nr;
int poz;

vector<int> sirNumere(DIMENSIUNE_MAXIMA_SIR, 0);
vector<int> subsirCrescatorMaximal(DIMENSIUNE_MAXIMA_SIR,0);
vector<int> pozitiiSubsirCrescatorMaximal(DIMENSIUNE_MAXIMA_SIR, 0);
vector<int> L(DIMENSIUNE_MAXIMA_SIR, 0);

ofstream out("scmax.out");

void CitireInput()
{
    ifstream in("scmax.in");
    in>> dimensiuneSirNumere;

    for( int i = 1; i<=dimensiuneSirNumere; ++i )
    {
        in>> sirNumere[i];
    }

    in.close();
}

int CautareBinara( int numar )
{
    int start = 0;
    int stop = nr;
    int mijloc = (start + stop) / 2;


    while( start <= stop )
    {
        if( sirNumere[L[mijloc]] < numar && sirNumere[L[mijloc + 1]] >= numar )
        {
            return mijloc;
        }
        else if( sirNumere[L[mijloc + 1]] < numar )
        {
            start = mijloc + 1;
            mijloc = (start + stop) / 2;
        }
        else
        {
            stop = mijloc - 1;
            mijloc = (start + stop) / 2;
        }
    }

    return nr;
}

void ConstruireSubsirCrescatorMaximal()
{
    nr = 1;
    subsirCrescatorMaximal[1] = L[1] = 1;
    L[0] = 0;

    for( int i = 2; i<=dimensiuneSirNumere; ++i )
    {
        poz = CautareBinara(sirNumere[i]);
        pozitiiSubsirCrescatorMaximal[i] = L[poz];
        subsirCrescatorMaximal[i] = poz + 1;
        L[poz + 1] = i;
        nr = max(nr, poz + 1);
    }
}
void DimensiuneSubsirCrescatorMaximal()
{
    dimensiuneSubsirCrescatorMaximal = 0;
    poz = 0;

    for( int i = 1; i<=dimensiuneSirNumere; ++i )
    {
        if( dimensiuneSubsirCrescatorMaximal < subsirCrescatorMaximal[i] )
        {
            dimensiuneSubsirCrescatorMaximal = subsirCrescatorMaximal[i];
            poz = i;
        }
    }
}

void ScrieSirCrescatorMaximal(int index)
{
    if( pozitiiSubsirCrescatorMaximal[index] > 0 )
    {
        ScrieSirCrescatorMaximal(pozitiiSubsirCrescatorMaximal[index]);
    }
    out<< sirNumere[index]<<" ";
}

void ScrieOutput()
{

    out<< dimensiuneSubsirCrescatorMaximal<< endl;

    ScrieSirCrescatorMaximal(poz);

    out.close();
}

int main()
{
    CitireInput();

    ConstruireSubsirCrescatorMaximal();

    DimensiuneSubsirCrescatorMaximal();

    ScrieOutput();



    return 0;
}