Cod sursa(job #49799)

Utilizator damaDamaschin Mihai dama Data 6 aprilie 2007 14:23:51
Problema Subsir 2 Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <stdio.h>

int n, v[5001], a[5001], prev[5001], solv[5001];

void print(int pos);
int f(int start, int end);


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

    int i, min, max, temp, x, sol;

    scanf("%d", &n);

    for(i = 1; i <= n; ++i)
    {
        scanf("%d", &v[i]);
    }
    min = 1;
    max = 1;
    for(i = 2; i <= n; ++i)
    {
        if(v[i] < v[min])
            min = i;
        if(v[i] > v[max])
            max = i;
    }

    a[0] = 0;
    v[0] = -1000001;

    sol = f(min, n);
    x = sol;
    temp = a[x];
    do
    {
        solv[x] = temp;
        --x;
        temp = prev[temp];
    }
    while(temp);
    temp = f(1, max);
    if(temp < sol)
    {
        sol = temp;
        x = sol;
        temp = a[x];
        do
        {
            solv[x] = temp;
            --x;
            temp = prev[temp];
        }
        while(temp);
    }

        printf("%d\n", sol);
        for(i = 1; i <= sol; ++i)
        {
            printf("%d ", solv[i]);
        }

    return 0;
}

void print(int pos)
{
    if(pos)
    {
        print(prev[pos]);
        printf("%d ", pos);
    }
}

int f(int start, int end)
{
    int i, min, mid, max, cnt = 1, sol;
    a[1] = start;
    for(i = start + 1; i <= end; ++i)
    {
        min = 0;
        max = cnt;
        sol = cnt;
        while(min <= max)
        {
            mid = (min + max) >> 1;
            if(v[a[mid]] <= v[i])
            {
                min = mid + 1;
                sol = mid;
            }
            else
            {
                max = mid - 1;
            }
        }
        a[sol + 1] = i;
        prev[i] = a[sol];
        if(sol + 1 > cnt)
            cnt = sol + 1;
            /*
        for(j = 1; j <= cnt; ++j)
        {
             printf("%d ", v[a[j]]);
        }
        printf("\n");
        */
    }
    return cnt;
}