Cod sursa(job #525960)

Utilizator icepowdahTudor Didilescu icepowdah Data 26 ianuarie 2011 20:59:42
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <cstdio>
using namespace std;

void printSol(int* pred, int *a, int pos);
int binSearch(int *a, int *lengths, int low, int high, int key);

int main(void)
{
  int N, i, j, maxLen;
  int *a, *lengths, *pred;
  
  freopen("scmax.in","r",stdin);
  freopen("scmax.out","w",stdout);

  scanf("%d",&N);
  a = new int[N];
  lengths = new int[N];
  pred = new int[N];

  for (i=0;i<N;i++)
  {
    scanf("%d",&a[i]);
  }
    
  pred[0] = -1;
  maxLen = 1;
  lengths[0] = 0;
  
  for (i=1;i<N;i++)
  {
    int bsResult = binSearch(a,lengths,0,maxLen-1,i);
    lengths[bsResult] = i;

    if (bsResult == 0)
    {      
      pred[i] = -1;
    }
    else 
    {
      pred[i] = lengths[bsResult-1];      
      if (bsResult == maxLen)
      {
        maxLen++;
      }
    }
  }

  printf("%d\n",maxLen);
  printSol(pred,a,lengths[maxLen-1]);
  printf("\n");

  delete[] a;
  delete[] lengths;
  delete[] pred;
  return 0;
}

void printSol(int* pred, int *a, int pos)
{
  if (pred[pos] != -1)
  {
    printSol(pred,a,pred[pos]);    
  }
  printf("%d ",a[pos]);
}

int binSearch(int *a, int *lengths, int low, int high, int key)
{
  int mid;
  while (low <= high)
  {
    mid = low + (high-low)/2;
    if (a[lengths[mid]] < a[key])
    {
      low = mid+1;
    }
    else high = mid-1;
  } 
  return low;
}