Cod sursa(job #617433)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 14 octombrie 2011 20:21:00
Problema Subsir crescator maximal Scor 35
Compilator cpp Status done
Runda Arhiva educationala Marime 2.12 kb
#include <iostream>
#include <cstdio>
#include <algorithm>

#define NMax 100005

using namespace std;

int N, V[NMax], Index[NMax];
int AI[NMax], DP[NMax];

inline int Max (int a, int b)
{
    if (a>b)
    {
        return a;
    }
    return b;
}

void Update (int K, int L, int R, int X, int Y)
{
    int Mid=(L+R)/2;
    if (L==R)
    {
        AI[K]=Y;
        return;
    }
    if (X<=Mid)
    {
        Update (2*K, L, Mid, X, Y);
    }
    else
    {
        Update (2*K+1, Mid+1, R, X, Y);
    }
    AI[K]=Max (AI[2*K], AI[2*K+1]);
}

int Query (int K, int L, int R, int QL, int QR)
{
    int Mid=(L+R)/2;
    if (QL<=L and R<=QR)
    {
        return AI[K];
    }
    int AnswerL=0, AnswerR=0;
    if (QL<=Mid)
    {
        AnswerL=Query (2*K, L, Mid, QL, QR);
    }
    if (QR>Mid)
    {
        AnswerR=Query (2*K+1, Mid+1, R, QL, QR);
    }
    return Max (AnswerL, AnswerR);
}

inline bool Compare (int i, int j)
{
    if (V[i]<V[j])
    {
        return true;
    }
    return false;
}

void Normalize ()
{
    sort (Index+1, Index+N+1, Compare);
    int CurrentV=0, X=-1;
    for (int i=1; i<=N; ++i)
    {
        if (V[Index[i]]!=X)
        {
            ++CurrentV;
        }
        X=V[Index[i]];
        V[Index[i]]=CurrentV;
    }
}

void LIS ()
{
    for (int i=1; i<=N; ++i)
    {
        if (V[i]==1)
        {
            DP[i]=1;
        }
        else
        {
            DP[i]=Query (1, 1, V[Index[N]], 1, V[i]-1)+1;
        }
        Update (1, 1, V[Index[N]], V[i], DP[i]);
        /*for (int j=i-1; j>0; --j)
        {
            if (V[j]<V[i] and DP[j]+1==DP[i])
            {
                F[i]=j;
                break;
            }
        }*/
    }
}

void Read ()
{
    freopen ("scmax.in", "r", stdin);
    scanf ("%d", &N);
    for (int i=1; i<=N; ++i)
    {
        scanf ("%d", &V[i]);
        Index[i]=i;
    }
}

void Print ()
{
    freopen ("scmax.out", "w", stdout);
    printf ("%d\n", AI[1]);
}

int main()
{
    Read ();
    Normalize ();
    LIS ();
    Print ();
    return 0;
}