Cod sursa(job #2294065)

Utilizator PinkiePie1189Preoteasa Mircea-Costin PinkiePie1189 Data 1 decembrie 2018 21:16:41
Problema Secv Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <map>
#include <vector>

#define MAXN 5000

FILE *fin, *fout;

int v[MAXN + 1];

struct spec {
    int val;
    int pos;

    bool operator< (spec B) {
        if (val == B.val)
            return pos < B.pos;
        else
            return val < B.val;
    }
} v2[MAXN + 1];

int catastif[MAXN + 1];

int d[MAXN + 1];

bool vis[MAXN + 1];

std::map <int, int> mp;
std::vector <int> neighbors[MAXN + 1];
int k = 0;

void dfs(int nod);

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

    int N;

    fscanf(fin, "%d", &N);

    for(int i = 0; i < N; i++) {
        fscanf(fin, "%d", &v[i]);
        v2[i].val = v[i];
        v2[i].pos = i;
    }

    std::sort(v2, v2 + N);

    for(int i = 0; i < N; i++) {
        if (catastif[v2[i].val] == 0) {
            v[v2[i].pos] = ++k;
            catastif[v2[i].val] = k;
        } else {
            v[v2[i].pos] = catastif[v2[i].val];
        }
    }

    for(int i = 0; i < N; i++) {
        for(int j = i + 1; j < N; j++) {
            if(v[j] == (v[i] + 1)) {
                neighbors[i].push_back(j);
            }
        }
    }

    for(int i = 0; i < N; i++) {
        if(!vis[i]) {
            vis[i] = 1;
            dfs(i);
        }
    }

    int ans = MAXN + 1;
    for(int i = 0; i < N; i++) {
        if(v[i] == 1) {
            ans = std::min(ans, d[i]);
        }
    }

    if(ans == (MAXN + 1)) {
        ans = -1;
    }

    fprintf(fout, "%d", ans);
}

inline void dfs(int nod) {
    d[nod] = MAXN + 1;

    if(v[nod] == k) {
        d[nod] = 1;
    }

    for(int i = 0; i < neighbors[nod].size(); i++) {
        int vec = neighbors[nod][i];

        if(!vis[vec]) {
            vis[vec] = 1;
            dfs(vec);
        }

        d[nod] = std::min(d[nod], vec - nod + d[vec]);
    }
}