Cod sursa(job #1520615)

Utilizator cristina_borzaCristina Borza cristina_borza Data 9 noiembrie 2015 09:13:06
Problema Secv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <algorithm>
#include <fstream>
#include <vector>

using namespace std;

ifstream f("secv.in");
ofstream g("secv.out");

int N , mx , sol = 5005;
int v[5005] , aux[5005] , nr[5005];

vector <vector <int> >  dp , mat;

int caut_bin1(int val);
int caut_bin2(int val , vector<int> a);

int main() {
    f >> N;

    mat.resize(N + 5);
    dp.resize(N + 5);

    for(int i = 1 ; i <= N ; ++i) {
        f >> v[i];
        aux[i] = v[i];
    }

    sort(aux + 1 , aux + N + 1);

    aux[0] = -1;
    for(int i = 1 ; i <= N ; ++i) {
        nr[i] = nr[i - 1];
        if(aux[i] != aux[i - 1]) {
            ++nr[i];
        }
    }

    for(int i = 1 ; i <= N ; ++i) {
        v[i] = nr[caut_bin1(v[i])];
        mx = max(mx , v[i]);

        mat[v[i]].push_back(i);
    }

    dp[1].resize(mat[1].size());
    for(int i = 0 ; i < mat[1].size() ; ++i) {
        dp[1][i] = 1;
    }

    for(int i = 2 ; i <= mx ; ++i) {
        dp[i].resize(mat[i].size());
        for(int j = 0 ; j < mat[i].size() ; ++j) {
            int x = caut_bin2(mat[i][j] , mat[i - 1]);
            if(x == -1) {
                dp[i][j] = -1;
            }
            else {
                if(dp[i - 1][x] != -1)
                    dp[i][j] = dp[i - 1][x] + mat[i][j] - mat[i - 1][x];
                else
                    dp[i][j] = -1;
            }
            int y = dp[i][j];
            ++y;
        }
    }

    for(int i = 0 ; i < dp[mx].size() ; ++i) {
        if(dp[mx][i] != -1)
            sol = min(sol , dp[mx][i]);
    }

    if(sol == 5005)
        sol = -1;
    g << sol;
    return 0;
}


int caut_bin1(int val) {
    int i , p = 0;
    for(i = 1 ; i <= N ; i <<= 1);
    while(i) {
        if(i + p <= N && aux[i + p] < val) {
            p += i;
        }
        i >>= 1;
    }

    return p + 1;
}

int caut_bin2(int val , vector<int> a) {
    int i , p = -1;
    for(i = 1 ; i < a.size() ; i <<= 1);
    while(i) {
        if(i + p < a.size() && a[i + p] < val){
            p += i;
        }
        i >>= 1;
    }

    return p;
}