Cod sursa(job #886692)

Utilizator mihai.bogdanMihai Bogdan mihai.bogdan Data 23 februarie 2013 10:00:18
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.1 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[100001],n,i,bst[100001],poz[100001], lgbst, pozitie, max, pozmax, sir[100001];

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);
    int pozcurent = n;
     for(i = lgbst; i>=1; i--)
     {
         while(poz[pozcurent] != i)
            pozcurent--;
         sir[i] = a[pozcurent];
     }
     for(i=1;i<=lgbst;i++)
        fprintf(fout, "%d ", sir[i]);

}