Cod sursa(job #1606106)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 19 februarie 2016 20:58:45
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <iostream>
#include <cstdio>
#define MAXN 100050

int din[MAXN], a[MAXN], sz, n; /// a[din[i]] = cel mai mic nr la care se termina un subsir de lungime i
int prev[MAXN]; /// reconstituire
int sol[MAXN], nq;

int getInd(int nr)
{
    /// cel mai mare indice cu din[i] < nr
    int step, rez;
    for (step = 1; step << 1 <= sz; step <<= 1);
    for (rez = 0; step; step >>= 1)
		if (rez+step <= sz && a[din[rez+step]] < nr)
			rez += step;
	return rez;
}

void solve()
{
	din[1] = 1; sz = 1;
	a[0] = 0x7fffffff;
	for (int i = 2; i <= n+1; i++) din[i] = 0;
    for (int i = 2; i <= n; i++) {
        int ind = getInd(a[i]);
        if (a[i] < a[din[ind+1]]) {
            prev[i] = din[ind];
            din[ind+1] = i;
        }
        sz = std::max(sz, ind+1);
    }
}

void afisare()
{
	printf("%d\n", sz);
    for (int i = 1, k = din[sz]; i <= sz; i++, k = prev[k])
		sol[++nq] = a[k];
	for (int i = nq; i; --i)
		printf("%d ", sol[i]);
}

int main()
{
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);

    scanf("%d ", &n);
    for (int i = 1; i <= n; i++)
		scanf("%d ", &a[i]);
    solve();
    afisare();
    return 0;
}