Cod sursa(job #1327394)

Utilizator PaueyPaula Nicoleta Gradu Pauey Data 26 ianuarie 2015 18:01:10
Problema Secv Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <algorithm>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

int v[5005];
vector<int> v2;

int bs(int st, int dr, int val) {
   int ans = -1;
   while(st <= dr) {
      int mid = (st + dr) / 2;
      if(val >= v2[mid]) {
         ans = mid;
         st = mid + 1;
      }
      else
         dr = mid - 1;
   }
   return ans;
}

int dp[5005];
int ult[5005];

int main()
{
    ifstream cin("secv.in");
    ofstream cout("secv.out");
    int N, x;
    cin >> N;
    for(int i = 1; i <= N; ++i) {
      cin >> v[i];
      v2.push_back(v[i]);
    }
    sort(v2.begin(), v2.end());
    /*vector<int> ::iterator itc = unique(v2.begin(), v2.end());
    v2.resize(distance(v2.begin(), itc));*/
    v2.erase(unique(v2.begin(), v2.end()), v2.end());
    for(int i = 1; i <= N; ++i) {
      v[i] = lower_bound(v2.begin(), v2.end(), v[i]) - v2.begin();
    }
    for(int i = 1; i <= N; ++i) {
      if(!v[i]) {
         dp[0] = 1;
         ult[0] = i;
      }
      else {
         if((!dp[v[i]] || dp[v[i]] > i - ult[v[i] - 1] + 1) && dp[v[i] - 1]) {
            dp[v[i]] = i - ult[v[i] - 1] + 1;
            ult[v[i]] = ult[v[i] - 1];
         }
         if((!ult[v[i]] || ult[v[i]] > ult[v[i] - 1]) && ult[v[i] - 1])
            ult[v[i]] = ult[v[i] - 1];

      }
      //cout << v[i] << ' ' << dp[v[i]] << ' ' << ult[v[i]] << '\n';
    }
    if(dp[v2.size() - 1])
      cout << dp[v2.size() - 1];
    else
      cout << -1;
    return 0;
}