Cod sursa(job #2749505)

Utilizator corina_dimitriuDimitriu Corina corina_dimitriu Data 6 mai 2021 21:20:07
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb
#include <fstream>
#define DMAX 100005

using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");

int PD(long long int s[DMAX],int n,int M[],int P[])
{
    int maxi=0,gasit,st,dr,mij;
    for(int i=0;i<=n;i++)
        M[i]=0;
    s[0]=2000000001;
    for(int i=1;i<=n;i++)
        {
           //cautare binara
          gasit=0;
          st=0;
          dr=maxi+1;
          while(dr-st>1)
          {
              mij=(st+dr)/2;
              if(s[M[mij]]<s[i])
                 st=mij;
              else
                 dr=mij;
          }

          if(s[M[st]]<s[i])
          {
              gasit=1;
              if(s[i]<s[M[st+1]])
                {
                    M[st+1]=i;
                    P[i]=M[st];
                }
              if(st+1>maxi)
                 maxi=st+1;
          }

          if(gasit==0)
              {
                if(s[i]<s[M[1]])
                   {
                       M[1]=i;
                       P[i]=-1;
                   }
                if(maxi==0)
                   maxi=1;
              }
        }
    return maxi;
}

long long int finalvec[DMAX];
void ReconstituireSolutie(long long int s[],int n,int M[],int P[],int sol)
{
    int poz=M[sol];
    int solvechi=sol;
    sol--;
    while(poz!=-1)
    {
        finalvec[sol]=s[poz];
        poz=P[poz];
        sol--;
    }
    for(int i=0;i<solvechi;i++)
        fout<<finalvec[i]<<' ';
}

int main()
{
    //vectorul s contine -1 pe pozitia 0 fiindca il consider indexat de la pozitia 1
    int M[DMAX],P[DMAX], n;
    long long int s[DMAX];
    fin>>n;
    for(int i=1;i<=n;i++)
        fin>>s[i];
    int sol=PD(s,n,M,P);
    fout<<sol<<'\n';
    ReconstituireSolutie(s,n,M,P,sol);
    return 0;
}