Cod sursa(job #1437432)

Utilizator romircea2010FMI Trifan Mircea Mihai romircea2010 Data 17 mai 2015 18:38:36
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
// Subsir crescator maximal - complexitate O (nlogn) - cu cautare binara
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

int n, a[100010], minim[100010], poz[100010], sol, v[100010], nv;
// minim[i] = valoarea minima cu care se poate termina un subsir de lungime i
// poz[i] = pozitia din vectorul minim gasita in urma cautarii binare pentru elementul a[i]

inline void Read()
{
    ifstream f("scmax.in");
    f>>n;
    int i;
    for (i=1; i<=n; i++)
        f>>a[i];
    f.close();
}

inline void Solve()
{
    int i, p;
    for (i=1; i<=n; i++)
    {
        p = upper_bound(minim+1, minim+sol+1, a[i]) - minim;
        if (minim[p-1] == a[i])
            p--;
        minim[p] = a[i];
        poz[i] = p;
        if (p>sol)
            sol = p;
    }
}

inline void Write()
{
    ofstream g("scmax.out");
    g<<sol<<"\n";
    int i, lg = sol;
    for (i=n; i; i--)
    {
        if (poz[i] == lg)
        {
            v[++nv] = a[i];
            lg--;
        }
    }
    for (i=nv; i; i--)
        g<<v[i]<<" ";
    g<<"\n";
    g.close();
}

int main()
{
    Read();
    Solve();
    Write();
    return 0;
}