Cod sursa(job #1083306)

Utilizator Aida_SilviaStrimbeanu Aida Silvia Aida_Silvia Data 15 ianuarie 2014 20:52:14
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#include <iostream>
#include <fstream>

#define maxn 100073

using namespace std;
int a[maxn];
int n;
int lungime_maxima;//lungimea celui mai lung subsir
int lungime_curenta; //lungimea calculata la fiecare pas
int poz[maxn];  //ce pozitie ocupa urmatorul numar din sir
int pozinceput[maxn]; //a[pozinceput[i]]- primul element ce apare intr-un subsir de lungime i

int bin(int start, int sfarsit, int valoare)//verific de la sfarsit la inceput ce elemente pot adauga la subsir,
{                                           //comparand cu celelalte
    int mijloc;
    while (start<=sfarsit)
    {
        mijloc=start + (sfarsit-start)/2;
        if (valoare<a[pozinceput[mijloc]])
            start=mijloc+1;
        else sfarsit=mijloc-1;

    }
    return start;
}

int main()
{
    ifstream in("scmax.in");
    ofstream out("scmax.out");

    in>>n;

    for (int i=1;i<=n;i++)
        in>>a[i];
    a[0]=2000000073;//ii dau o valoare mare ca sa nu intre in subsir

    for (int i=n;i>=1;i--)
    {
        poz[i]=0;
        lungime_curenta=bin(1,lungime_maxima,a[i]);//caut lungime actuala
        if (lungime_curenta>lungime_maxima)
        {
            poz[i]=pozinceput[lungime_curenta-1]; //calculez pozitia actuala in subsir
            lungime_maxima=lungime_curenta;
            pozinceput[lungime_maxima]=i; //il iau ca fiind primul element din subsir, deoarece merg in vector de la sfarsit

        }
        else
        {
            poz[i]=pozinceput[lungime_curenta-1];
            if (a[pozinceput[lungime_curenta]]<a[i]) //verific sa fie strict crescator
                pozinceput[lungime_curenta]=i;
        }
    }


     out<<lungime_maxima<<"\n";

     for (int i=pozinceput[lungime_maxima];i>0;i=poz[i]) //afisez
     {
         out<<a[i]<<" ";
     }

    return 0;
}