Cod sursa(job #2651889)

Utilizator Razvan48Capatina Razvan Nicolae Razvan48 Data 23 septembrie 2020 19:00:46
Problema Secv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <fstream>
#include <algorithm>
#include <climits>
#include <unordered_map>

using namespace std;

const int NMAX = 5000;

int v[1 + NMAX];
int last[1 + NMAX];
int dp[1 + NMAX];

int lsir;
int c[1 + NMAX];

unordered_map<int, int> hm;

int main()
{
  ifstream in("secv.in");
  ofstream out("secv.out");
  int n;
  int minim = INT_MAX;

  in >> n;
  for (int i = 1; i <= n; i++)
  {
    in >> v[i];
    dp[i] = INT_MAX;
    last[i] = INT_MAX;

    if (hm.find(v[i]) == hm.end())
    {
      hm.emplace(v[i], v[i]);

      lsir++;
      c[lsir] = v[i];
    }
  }

  // Normalizare
  sort(c + 1, c + 1 + lsir);

  for (int i = 1; i <= lsir; i++)
  {
    hm[c[i]] = i;
  }

  for (int i = 1; i <= n; i++)
  {
    v[i] = hm[v[i]];
  }

  for (int i = 1; i <= n; i++)
  {
    last[v[i]] = i;

    if (v[i] == 1)
    {
      dp[v[i]] = 1;
      continue;
    }

    int pred = v[i] - 1;
    int pos_pred = last[pred];

    if (pos_pred  < i && dp[pred] != INT_MAX)
    {
      dp[v[i]] = dp[pred] + i - pos_pred;
      if (v[i] == lsir)
      {
        minim = min(minim, dp[v[i]]);
      }
    }
  }

  if (lsir == 1)
  {
    minim = 1;
  }

  if (minim == INT_MAX)
    out << -1 << '\n';
  else
    out << minim << '\n';

  return 0;
}