Cod sursa(job #2308516)

Utilizator BotzkiBotzki Botzki Data 27 decembrie 2018 11:57:58
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int NMAX=100000;
vector <int>sol;
int ml[NMAX+5];
//in ml[i] retinem indicii finali cei mai mici pentru subsecventa de lungime i
int lungmax[NMAX+5];
//lungmax[i]- pentru lungimea i a subsirului strict crescator punem pozitia valorii minime pt care exista un subsir crescator de lungime i cu aceasta pozitie la final
int v[NMAX+5];
int cautare_binara(int val, int dr)
{
    int st=1, med, last=0;
    while(st<=dr)
    {
        med=(st+dr)>>1;
        if(ml[med]<val)
        {
            last=med;
            st=med+1;
        }
        else
            dr=med-1;
    }
    return last;
}
int main()
{
    int submax=0, lung_c, n, i;
    fin>>n;
    for(i=1;i<=n;i++)
        fin>>v[i];
    for(i=1;i<=n;i++)
    {
        lung_c=cautare_binara(v[i], submax);
        if(ml[lung_c+1]>v[i])
            ml[lung_c+1]=v[i];
        lungmax[i]=lung_c+1;
        if(lung_c+1>submax)
        {
            submax=lung_c+1;
            ml[submax]=v[i];
        }
    }
    fout<<submax<<"\n";
    //Reconstituirea
    for(i=n;i>=1;i--)
    {
        if(submax==lungmax[i])
        {
            sol.push_back(v[i]);
            submax--;
        }
    }
    for(i=sol.size()-1;i>=0;i--)
        fout<<sol[i]<<" ";
    return 0;
}