Cod sursa(job #1863951)

Utilizator bleo16783FMI Bleotiu Cristian bleo16783 Data 31 ianuarie 2017 12:54:41
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <iostream>
#include<fstream>
using namespace std;
#define N 100100
int i,L[N],v[N],p[N],n,nr,m,poz,best[N],mx;
///L[i]->indicele ultimului element din subsirul crescator de lungime i
///p[i]->indicele ultimului element din subsirul optim obtinut prin adaugarea lui v[i] la sfarsit;
///best[i]=lungimea subsirului optim terminat cu v[i]
int bs(int x)///returneaza pozitia lui x in subsirul optim
{
    int p,u,m;
    p=0;u=nr;
    m=(p+u)/2;
    while(p<=u)
    {
        if(v[L[m]]<=x && v[L[m+1]]>x)
            return m;
        else
        {
            if(v[L[m]]>x)
            {
                p=m+1;m=(p+u)/2;
            }
            else
            {
                u=m-1;
                m=(p+u)/2;
            }
        }
    }
    return nr;
}
ofstream g("scmax.out");
void afis(int i)
{
    if(p[i]>0)///nu am ajuns la primul element din subsir
        afis(p[i]);
    g<<v[i]<<" ";
}
int main()
{
    ifstream f("scmax.in");
    f>>n;
    for(i=1;i<=n;++i)f>>v[i];
    L[0]=0;nr=1;
    L[1]=1;
    for(i=2;i<=n;++i)
    {
        poz=bs(v[i]);
        p[i]=L[poz];
        best[i]=poz+1;
        L[poz+1]=i;
        if(poz+1>nr)nr=poz+1;
    }
    for(i=1;i<=n;++i)
    {
        if(mx<best[i])
        {
            mx=best[i];///mx->lungimea celui mai lung subsir crescator
            poz=i;
        }
    }
    g<<mx<<'\n';
    afis(poz);
    return 0;
}