Cod sursa(job #895627)

Utilizator mvcl3Marian Iacob mvcl3 Data 27 februarie 2013 12:00:43
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include<cstring>
#include<cstdio>
using namespace std;

const int NMAX = 100009;
const int DIM = 262144;
int a[NMAX], best[NMAX], n, pre[NMAX], maxim, poz;
char c[DIM + 10], *p;

inline void read_Data();
inline void solve();

int main()
{
    freopen("scmax.in", "rt", stdin); freopen("scmax.out", "wt", stdout);
    read_Data();
    solve();

    printf("%d\n", maxim);
    int i;
    for(i = poz; pre[i] != -1; i = pre[i])
        if(a[i]) printf("%d ", a[i]);

    printf("%d\n", a[i]);
    return 0;
}

inline void read_Data()
{
    scanf("%d", &n);
    fread(c, 1, DIM, stdin);
    int nbr, k = 0;
    for(p = c + 1; *p; )
        if(*p != ' ' && *p != '\n')
        {
            nbr = 0;
            while(*p >= '0' && *p <= '9')
            {
                nbr = nbr * 10 + *p - '0';
                ++p;
            }
            a[++k] = nbr;
        }
        else
            ++p;
}

inline void solve()
{
    best[n] = 1;
    maxim = 1, poz = n;
    pre[n] = -1;
    memset(pre, -1, sizeof(pre));
    for(int i = n; i > 1; --i)
        for(int j = i - 1; j >= 1; --j)
        {
            if(a[j] < a[i] && best[j] <= best[i])
            {
                best[j] = 1 + best[i];
                if(best[j] > maxim) maxim = best[j], poz = j;
                pre[j] = i;
            }
        }
}