Cod sursa(job #1658301)

Utilizator ciprianprohozescuProhozescu Ciprian ciprianprohozescu Data 21 martie 2016 12:28:55
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <fstream>
#define DMAX 100010

using namespace std;

FILE *fin, *fout;

int n, v[DMAX], a[DMAX], poz[DMAX], sol[DMAX], lgmax, lg;

void construct(); //construiesc dinamic un subsir crescator maximal si retin in vectorul auxiliar poz pozitia fiecarui element in acest subsir
int cautare_binara(int x); //caut pozitia fiecarui element in subsirul curent
void solutie(); //reconstitui solutia plimbandu-ma inapoi prin vectorul poz

int main()
{
    int i;
    fin = fopen("scmax.in", "r");
    fout = fopen("scmax.out", "w");
    fscanf(fin, "%d", &n);
    construct();
    solutie();
    fprintf(fout, "%d\n", lgmax);
    for (i = 1; i <= lgmax; i++)
        fprintf(fout, "%d ", sol[i]);
    fprintf(fout, "\n");
    fclose(fout);
    return 0;
}

void construct()
{
    int i, pozx;
    for (i = 1; i <= n; i++)
    {
        fscanf(fin, "%d", &v[i]);
        pozx = cautare_binara(v[i]);
        if (pozx > lg)
            lg = pozx;
        a[pozx] = v[i];
        poz[i] = pozx;
        if (pozx > lgmax)
            lgmax = pozx;
    }
}
int cautare_binara(int x)
{
    int st = 1, dr = lg, mij;
    while (st <= dr)
    {
        mij = (st + dr) / 2;
        if (x == a[mij]) return mij;
        if (x < a[mij])
            dr = mij - 1;
        else
            st = mij + 1;
    }
    return st;
}
void solutie()
{
    int i, copie = lgmax;
    for (i = n; i >= 1 && copie; i--)
    {
        if (poz[i] == copie)
        {
            sol[copie] = v[i];
            copie--;
        }
    }
}