Cod sursa(job #2533183)

Utilizator hunting_dogIrimia Alex hunting_dog Data 28 ianuarie 2020 20:19:06
Problema Subsir 2 Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#define NMAX 5000

using namespace std;

ifstream fin("subsir2.in");
ofstream fout("subsir2.out");

struct el
{
    int info,index;
};

void read(el *v,int &n)
{
    fin>>n;
    for(int i=0;i<n;++i)
        {
            fin>>v[i].info;
            v[i].index=i;
        }
}

void print(el *v,int n)
{
    for(int i=0;i<n;++i)
        cout<<v[i].info<<' '<<v[i].index<<'\n';
    cout<<'\n';
}

bool cmp(el x,el y)
{
    return (x.info>y.info);
}

int getPos(el *v,int *best,int n,int val)
{
    int l=1,r=n;
    while(l<r-1)
    {
        int m=(l+r)/2;
        if(v[best[m]].index>val)
            r=m;
        else
            l=m;
    }

    if(v[best[l]].index>=val)
        return r;
    return l;
}

int maxLenSeq(el *v,int n,int *final_vec)
{
    int best[NMAX],prec[NMAX],k=1,last=0;
    best[0]=prec[0]=-1;
    best[1]=0;
    for(int i=1;i<n;++i)
    {
        if(v[i].index<=v[best[k]].index)
        {
            //last=i;
            best[++k]=i;
            prec[i]=best[k-1];
        }
        else
        {
            int pos=getPos(v,best,k,v[i].index);
            best[pos]=i;
            prec[i]=best[pos-1];
        }
    }

    int nr=0;
    last=best[k];
    while(prec[last]!=-1)
    {
        final_vec[nr++]=v[last].info;
        last=prec[last];
    }
    final_vec[nr++]=v[last].info;

    return nr;
}

int main()
{
    el v[NMAX];
    int n;
    read(v,n);
    sort(v,v+n,cmp);
    print(v,n);
    int res[NMAX],k=maxLenSeq(v,n,res);
    fout<<k<<'\n';
    for(int i=0;i<k;++i)
        fout<<res[i]<<' ';


    return 0;
}