Cod sursa(job #1537340)

Utilizator trutruvasilicaHuhurez Marius trutruvasilica Data 27 noiembrie 2015 09:22:22
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.99 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

const int Nmax = 100;

int N;
int V[100001], Q[100001], P[100001], SOL[100001];
ofstream fout("scmax.out");
void read()
{
    ifstream f("scmax.in");

    f >> N;

    for ( int i = 1; i <= N; ++i )
            f >> V[i];

    f.close();
}

int cautare( int key )
{
    int st = 1, dr = Q[0], gasit = -1;

    while ( st <= dr )
    {
        int m = ( st + dr ) / 2;

        if ( Q[m] >= key ) /// am gasit un Q[m] mai mare decat key
        {
            gasit = m;
            dr = m - 1; /// caut unul mai mic
        }
        else /// Q[m] este mai mic decat key
        {
            st = m + 1; /// caut unul mai mare
        }
    }

    return gasit;
}

void SCM()
{
    for ( int i = 1; i <= N; ++i )
    {
        int poz = cautare( V[i] ); /// caut binar in Q
                                   /// cel mai mic element
                                   /// mai mare decat V[i]

        if ( poz == -1 ) /// V[i] este mai mare decat tot vect Q
        {
            Q[0]++; /// cresc dimensiunea subsirului maximal

            Q[ Q[0] ] = V[i]; /// pun V[i] in Q
            P[i] = Q[0]; /// setez faptul ca V[i] corespunde pozitiei Q[0]
        }
        else
        {
            Q[poz] = V[i]; /// inlocuiesc elementul gasit mai mare cu V[i]
            P[i] = poz; /// setez faptul ca V[i] corespunde pozitiei poz
        }
    }
}

void drum()
{
    fout << Q[0] << "\n"; /// afisez dimensiunea

    int poz = N;

    for ( int i = Q[0]; i >= 1; i-- ) /// pentru fiecare pozitie
                                      /// a subsirului maximal
    {
        while ( P[poz] != i ) /// caut elementul ce corespunde pozitiei i
                poz--;

        SOL[i] = V[poz]; /// il adaug in solutie
    }

    for ( int i = 1; i <= Q[0]; ++i )
            fout << SOL[i] << " ";
}

int main()
{
    read();
    SCM();
    drum();

    return 0;
}