Pagini recente » Cod sursa (job #2955749) | Cod sursa (job #699564) | Cod sursa (job #268590) | Cod sursa (job #2250818) | Cod sursa (job #1534496)
//************************************************************************
// PSIHOLOGIA CONCURSURILOR DE INFORMATICA - PROBLEMA 13
// v 2 5 7 3 4 1
// q 2 2,5 2,5,7 2,3 2,3,4 1 - BEST TIL NOW
// p 1 2 3 2 3 1 - AL CATELEA ESTE IN LISTA Q
// SE INSEREAZA NOUL ELEMENT PE Q[m] > v[i] => Q[M] = V[I]; P[I] = M;
// !! CAUTATRE IN Q CU CAUTARE BINARA !!
//************************************************************************
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
const int nmax = 100002;
const int INF = 1 << 30;
int n, len = 0,v[nmax], q[nmax], p[nmax], res[nmax];
int generare();
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out","w",stdout);
scanf("%d ", &n);
for (int i = 0; i < n; i++) scanf("%d ", &v[i]);
memset(q, 0, 4 * (n + 2));
memset(p, 0, 4 * (n + 2));
int l = generare();
printf("%d \n", l+1);
for (int i = 0; i <= l; i++)
printf("%d ", q[i]);
fclose(stdin);
fclose(stdout);
return 0;
}
int cautareBinara(int el, int ve, int k) {
if (el == ve) {
if (ve == len) q[++len] = INF;
q[ve] = k;
return el;
}
int mid = (el + ve) / 2;
if (q[mid] < k) return cautareBinara(mid + 1, ve, k);
else return cautareBinara(el, mid , k);
}
int generare()
{
int j, max = -1,maxInd = 0;
q[0] = INF;
for (int i = 0; i < n; i++) {
p[i] = cautareBinara(0,len,v[i]);
if (p[i] > max) { max = p[i]; maxInd = i; };
}
int k = max;
for (int i = maxInd; i >= 0; i--){
if (p[i] == k) {
q[k] = v[i];
k--;
}
}
return max;
}