Cod sursa(job #1384701)

Utilizator PhilipDumitruPhilip Dumitru PhilipDumitru Data 11 martie 2015 12:39:58
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <fstream>

#define n_MAX 100001
#define INF_NEG 0xa0000000

using namespace std;

int sir[n_MAX];
int best[n_MAX];
int lengthVal[n_MAX];
int previous[n_MAX];

int binarySearch(int x, int left, int right)
{
    int n = right;
    int mid = (left + right) / 2;
    while (left <= right)
    {
        if (x > sir[lengthVal[mid]] && x <= sir[lengthVal[mid+1]]) {
            return mid;
        } else if (x > sir[lengthVal[mid+1]]) {
            left = mid + 1;
            mid = (left + right) / 2;
        } else /*if (x <= sir[lengthVal[mid]])*/ {
            right = mid - 1;
            mid = (left + right) / 2;
        };
    }
    return n;
}

int main()
{
    FILE * fin = fopen ("scmax.in", "r");
    FILE * fout = fopen ("scmax.out", "w");

    int n, i, j, sirSize = 1;
    fscanf(fin, "%d", &n);
    for (i = 1; i <= n; ++i)
    {
        fscanf(fin, "%d", &sir[i]);
    }

    best[1] = lengthVal[1] = 1;
    sir[0] = INF_NEG;
    for (i = 2; i <= n; ++i)
    {
        j = binarySearch(sir[i], 0, sirSize);
        previous[i] = lengthVal[j];
        best[i] = j+1;
        lengthVal[j+1] = i;
        if (j >= sirSize)
            sirSize = j+1;
    }

    for (i = 1, sirSize = 0; i <= n; ++i)
    {
        if (best[i] > sirSize)
        {
            sirSize = best[i];
            j = i;
        }
    }
    fprintf(fout, "%d\n", sirSize);
    i = 0;
    lengthVal[0] = j;
    while (previous[lengthVal[i++]])
    {
        lengthVal[i] = previous[lengthVal[i - 1]];
    }
    for (--i; i > 0; --i)
    {
        fprintf(fout, "%d ", sir[lengthVal[i]]);
    }
    fprintf(fout, "%d\n", sir[j]);

    fclose(fin);
    fclose(fout);
    return 0;
}