Cod sursa(job #1162159)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 31 martie 2014 17:46:55
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <cstdio>
#include <algorithm>
#define Nmax 100005

using namespace std;

struct nr
{
    int val,poz;
    bool operator < (const nr A) const
    {
        return val<A.val;
    }
};
nr v[Nmax],aib[Nmax];
int N,a[Nmax],dp[Nmax],nxt[Nmax],sol[Nmax],t[Nmax];

inline void Normalizare()
{
    int i;
    sort(v+1,v+N+1);
    a[v[1].poz]=1;
    t[v[1].poz]=1;
    for(i=2;i<=N;++i)
        if(v[i].val==v[i-1].val)
        {
            a[v[i].poz]=a[v[i-1].poz];
            t[v[i].poz]=i;
        }
        else
        {
            a[v[i].poz]=a[v[i-1].poz]+1;
            t[v[i].poz]=i;
        }
}

inline void Update(int x, nr w)
{
    int i;
    for(i=x;i<=N;i+=(i&(-i)))
        if(w.val>aib[i].val)
            aib[i]=w;
}

inline nr Query(int x)
{
    int i;
    nr w;
    w.poz=w.val=0;
    for(i=x;i>0;i-=(i&(-i)))
        if(aib[i].val>w.val)
            w=aib[i];
    return w;
}

int main()
{
    int i,maxim=0,poz;
    nr w;
    freopen ("scmax.in","r",stdin);
    freopen ("scmax.out","w",stdout);
    scanf("%d", &N);
    for(i=1;i<=N;++i)
    {
        scanf("%d", &v[i].val);
        v[i].poz=i;
    }
    Normalizare();
    w.val=1; w.poz=1;
    dp[1]=1; Update(a[1],w);
    for(i=2;i<=N;++i)
    {
        w=Query(a[i]-1);
        dp[i]=w.val+1;
        nxt[i]=w.poz;
        w.val=dp[i]; w.poz=i;
        Update(a[i],w);
    }
    for(i=1;i<=N;++i)
        if(dp[i]>maxim)
        {
            maxim=dp[i];
            poz=i;
        }
    while(poz)
    {
        sol[++sol[0]]=v[t[poz]].val;
        poz=nxt[poz];
    }
    printf("%d\n", maxim);
    for(i=sol[0];i;--i)
        printf("%d ", sol[i]);
    printf("\n");
    return 0;
}