Cod sursa(job #823228)

Utilizator octavianOctavian Crintea octavian Data 24 noiembrie 2012 19:36:59
Problema Subsir crescator maximal Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.1 kb
#include <stdio.h>
#include <stdlib.h>
int longestIncreasingSubsequence(const int *seq, int n, int **subseq);int binarySearch(const int *a, int n, int x);int main(void){int n, m, i;int *seq, *subseq;freopen("scmax.in", "r", stdin);freopen("scmax.out", "w", stdout);scanf("%d", &n);seq = (int *)malloc(n * sizeof(int));for (i = 0;i < n;i++){	scanf("%d", seq + i);}
m = longestIncreasingSubsequence(seq, n, &subseq);printf("%d\n", m);for (i = 0;i < m;i++){	printf("%d ", subseq[i]);}
printf("\n");free(seq);free(subseq);return 0;}
int longestIncreasingSubsequence(const int *seq, int n, int **subseq){int i, k, lenq;int *q, *p;q = (int *)malloc(n * sizeof(int));lenq = 0;p = (int *)malloc(n * sizeof(int));for (i = 0;i < n;i++){	k = binarySearch(q, lenq, seq[i]);	if (k >= lenq){	 lenq++;	}
	q[k] = seq[i];	p[i] = k;}
k = lenq - 1;for (i = n - 1;i >= 0;i--){	if (p[i] == k){	 q[k--] = seq[i];	}
}
free(p);*subseq = q;return lenq;}
int binarySearch(const int *a, int n, int x){int i = 0, j = n - 1, m;while (i <= j){	m = ((i + j)>> 1);	if (x == a[m]){	 return m;	}
	if (x <= a[m]){	 j = m - 1;	} else {	 i = m + 1;	}
}
return i;}