Cod sursa(job #1384963)

Utilizator PhilipDumitruPhilip Dumitru PhilipDumitru Data 11 martie 2015 16:13:23
Problema Secv Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.11 kb
#include <fstream>
#include <set>

#define n_MAX   5001
#define INF_NEG 0xa0000000
#define INF     0x5fffffff

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 ("secv.in", "r");
    FILE * fout = fopen ("secv.out", "w");

    int n, i, j, sirSize = 1, uniqueNo;
    set<int> uniqueSet;
    fscanf(fin, "%d", &n);
    for (i = 1; i <= n; ++i)
    {
        fscanf(fin, "%d", &sir[i]);
        uniqueSet.insert(sir[i]);
    }
    uniqueNo = uniqueSet.size();

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

        } else {
            previous[i] = i;
        }
        if (j + 1 == uniqueNo)
            best[i] = i - previous[i];
        lengthVal[j+1] = i;
        if (j >= sirSize)
            sirSize = j+1;
    }

    for (i = 1, sirSize = INF; i <= n; ++i)
    {
        if (best[i] && best[i] < sirSize)
        {
            sirSize = best[i];
            //j = i;
        }
    }
    if (sirSize != INF)
        fprintf(fout, "%d\n", sirSize+1);
    else
        fprintf(fout, "-1\n");
    /*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;
}