Cod sursa(job #886679)

Utilizator mihai.bogdanMihai Bogdan mihai.bogdan Data 23 februarie 2013 09:47:01
Problema Subsir crescator maximal Scor 45
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#include <stdio.h>

FILE *fin = fopen("scmax.in", "r");
FILE *fout = fopen("scmax.out", "w");

// lucram cu 2 vectori. BST[i] = cel mai mic element cu care se poate termina un subsir de lungime i.
// POZ[i] = pozitia pe care este plasat a[i] in BST
// Initial, BST este gol. Parcurgem vectorul a. La pasul i:
// Caut binar cel mai mic element din BST care e mai mare decat a[i].
// Daca l-am gasit, inlocuiesc elemnentul respectiv cu a[i], altfel il punem la sfarsitul lui BST[i]
// In ambele cazuri, retinem in poz si pozitia pe care a fost plasat a[i]
// La final, lg vectorului BST va fi de fapt egala cu lungimea celui mai lung subsir crescator
// Pentru a reconstitui subsirul utilizam pozitiile din poz.
// -parcurg vectorul poz de la dr la st. La fiecare pas identific poz

long long a[100000],n,i,bst[100000],poz[100000], lgbst, pozitie, max, pozmax;

using namespace std;

int caut_binar(int p, int u, int x)
{
    int m;
    int maxX = -1;
    while(p<=u){
        m = (p+u)/2;
        if(bst[m] >= x)
        {
            maxX = m;
            u = m-1;
        }
        else
        {
            p=m+1;
        }
    }

    return maxX;

}

int main()
{
    fscanf(fin,"%d", &n);
    for(i=1; i<=n; i++)
        fscanf(fin, "%d", &a[i]);
    bst[1] = a[1];
    poz[1] = 1;
    lgbst = 1;
    for(i=2; i<=n; i++)
    {
        pozitie = caut_binar(1, lgbst, a[i]);
        if(pozitie > -1)
        {
            bst[pozitie] = a[i];
            poz[i] = pozitie;
            if(poz[i] > max){
                max = poz[i];
                pozmax = i;
            }

        }
        else
        {

            bst[++lgbst] = a[i];
            poz[i] = lgbst;
            if(poz[i] > max){
                max = poz[i];
                pozmax = i;
            }
        }
    }
    fprintf(fout, "%d\n", lgbst);
     for(i=1; i<= lgbst; i++)
        fprintf(fout, "%d ", bst[i]);
}