Cod sursa(job #2650238)

Utilizator rares404AlShaytan - Balasescu Rares rares404 Data 17 septembrie 2020 19:59:26
Problema Secv Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 kb
//
//  main.cpp
//  secv
//
//  Created by Eusebiu Rares on 17/09/2020.
//  Copyright © 2020 Eusebiu Rares. All rights reserved.
//

#include <iostream>
#include "fstream"
#include "unordered_map"
#include "vector"
#include "algorithm"

std::fstream input ("secv.in", std::ios::in) ;
std::fstream output ("secv.out", std::ios::out) ;

const int MV = 5000 ;

int v[MV + 1], last ;

void normalise(int n) {
	std::vector<int> temp(n + 1) ;
	std::unordered_map<int, int> resp ;
	for (int i = 1 ; i <= n ; ++ i) {
		temp[i] = v[i] ;
	}
	std::sort(begin(temp), end(temp)) ;
	int var(1) ;
	for (int i = 1 ; i <= n ; ++ i) {
		if (temp[i] != temp[i - 1]) {
			resp[temp[i]] = var ++ ;
		}
	}
	last = var - 1 ;
	for (int i = 1 ; i <= n ; ++ i) {
		v[i] = resp[v[i]] ;
	}
}

int p[MV + 1] ;
int f[MV + 1] ;
int dp[MV + 1] ;

int main(int argc, const char * argv[]) {
	int n ; input >> n ;
	if (n == 1) {
		return output << 1, 0 ;
	}
	for (int i = 1 ; i <= n ; ++ i) {
		input >> v[i] ;
	}
	normalise(n) ;
	int ans(1e9) ;
	for(int i = 1; i <= n; i ++)
	{
			if(v[i] == 1)
					p[i] = i;
			else
					p[i] = f[v[i] - 1];
			f[v[i]] = i;
	}
	int mn = (1 << 30);
	for(int i = 1; i <= n; i ++)
	{
			if(p[i] != 0)
					dp[i] = dp[p[i]] + i - p[i];
			else
					dp[i] = (1 << 30);
			if(v[i] == last)
					mn = std::min(mn, dp[i]);
	}
	if (ans == 1e9) {
		ans = -1 ;
	}
	output << mn + 1 ;
}