Cod sursa(job #2650259)

Utilizator rares404AlShaytan - Balasescu Rares rares404 Data 17 septembrie 2020 20:19:16
Problema Secv Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.82 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"
#include "map"

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

const int MV = 2000000 ;

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) {
//		std::cout << v[i] << ' ' << resp[v[i]] << '\n' ;
		v[i] = resp[v[i]] ;
	}
}

std::map <int, int> c;
int fr[50005];

int prevPoint[MV + 1] ;
int lastSeen[MV + 1] ;
int sol[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];
			if(fr[v[i]] == 0)
			{
					c[v[i]] ++;
					fr[v[i]] = 1;
			}
	}
	int pos = 0;
	for(auto it : c)
	{
			++pos;
			fr[it.first] = pos;
	}
	/*std::cout << '\n' ;
	for (int i = 1 ; i <= n ; ++ i) {
		std::cout << v[i] << ' ' ;
	}
	std::cout << '\n' ;*/
	int ans(1e9) ;
	for (int i = 1 ; i <= n ; ++ i) {
		v[i] = fr[v[i]] ;
		if (v[i] == 1) {
			prevPoint[i] = i ;
		} else {
			prevPoint[i] = lastSeen[v[i] - 1] ;
		}
		lastSeen[v[i]] = i ;
	}
	for (int i = 1 ; i <= n ; ++ i) {
		if (prevPoint[i]) {
			sol[i] = sol[prevPoint[i]] + (i - prevPoint[i]) ;
		} else {
			sol[i] = 1e9 ;
		}
		if (v[i] == c.size()) {
			ans = std::min(ans, sol[i]) ;
//			std::cout << i - sol[i] << ' ' << i << '\n' ;
		}
	}
	if (ans == 1e9) {
		ans = -2 ;
	}
	output << ans + 1 ;
}