Cod sursa(job #285809)

Utilizator titusuTitus C titusu Data 22 martie 2009 22:52:28
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
/*
 * 
 * Determina subsirul crescator maximal folosid algoritmul clasic, de complexitate n*n
 * 
 * */
#include <stdio.h>
#include <stdlib.h>
#define DIM 100001
#define INFINIT 2000000001
typedef int Vector[DIM];
FILE *fin=fopen("scmax.in","r");
FILE *fout=fopen("scmax.out","w");

Vector v, p, q;
int n,L;

void afis(int v[], int n)
{
  for(int i=1;i<=n;i++)
    printf("%d ",v[i]);
  printf("\n");
}

int Insert(int x, int st, int dr)
{
  int mijloc=(st+dr)/2;
  if(st==dr)
  {
    if(st>L)  q[++L+1]=INFINIT;
    q[st]=x;
    return st;
  }
  else
    if(x<=q[mijloc])
      return Insert(x, st, mijloc);
    else
      return Insert(x, mijloc+1,dr);
}
void SCM()
{
  int i;
  L=0; q[1]=INFINIT;
  for(i=1;i<=n;i++)
    p[i]=Insert(v[i],1,L+1);
  
}

void Afisare()
{
  fprintf(fout,"%d\n",L);
  int *sol=(int *) malloc((L+1)*sizeof(int)); // in sol[] voi memora elementele din subsirul solutie
  int j=n;
  for(int i=L;i;i--)
  {
    //caut in p[] ultima aparitie a lui i, aflata inaintea pozitiei k[capat+1];
    while(p[j]!=i) j--;
    sol[i]=v[j];
  }
  for(int i=1;i<=L;i++)
    fprintf(fout,"%d ",sol[i]);
}

void Citire()
{
  fscanf(fin,"%d",&n);
  for(int i=1;i<=n;i++)
    fscanf(fin,"%d",v+i);
}

int main()
{
  Citire();
  SCM();
  Afisare();
  return 0;
}