Cod sursa(job #1998159)

Utilizator nicolaefilatNicolae Filat nicolaefilat Data 6 iulie 2017 19:26:05
Problema Subsir crescator maximal Scor 35
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <binders.h>
#define MAXN 100005

using namespace std;

ifstream in("scmax.in");
ofstream out ("scmax.out");

int N,i,j;
long int v[MAXN],D[MAXN],ans,counter = 1;

void cit(){
    in>>N;
    for(i = 0 ; i < N; i++ ){
        in>>v[i];
    }
}
void text(){
    cout<<endl<<endl;
    for(int x = 0 ; x < N; x ++){
        cout<<D[x]<<" ";
    }

}
void quickSort(long int arr[], int left, int right) {
      int i = left, j = right;
      int tmp;
      int pivot = arr[(left + right) / 2];

      /* partition */
      while (i <= j) {
            while (arr[i] < pivot)
                  i++;
            while (arr[j] > pivot)
                  j--;
            if (i <= j) {
                  tmp = arr[i];
                  arr[i] = arr[j];
                  arr[j] = tmp;
                  i++;
                  j--;
            }
      };

      /* recursion */
      if (left < j)
            quickSort(arr, left, j);
      if (i < right)
            quickSort(arr, i, right);
}
void rezolvare(){
    // D - vector in care punem lungimea celei mai lungi subsecevente pana la i
    for(i = 0 ; i < N; i ++){
        D[i] = 1; //un singur element se considera ca o subsecventa
    }
    for(i = 1; i < N; i ++){
        for(j = 0 ; j < i; j ++){

            if(v[i] > v[j] && D[i] < D[j] + 1/*minim*/){
                D[i] = D[j] + 1;
            }
        }
    }
    quickSort(D,0,N-1);
    ans = D[N-1];
    out<<D[N-1]<<"\n";
    for(i = 1 ; i < N; i ++ ){
        if(D[i] == counter ){
            out<<v[i]<<" ";
            counter ++;
        }
    }




}

int main()
{
    cit();
    rezolvare();
    return 0;
}