Cod sursa(job #2118383)

Utilizator flibiaVisanu Cristian flibia Data 30 ianuarie 2018 16:48:37
Problema Secv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#pragma GCC optimize("03")
#include <bits/stdc++.h>
#define N 5010

using namespace std;

ifstream in("secv.in");
ofstream out("secv.out");

struct lol{
	int val, idx;
};

int n, vf, mn = N;
lol a[N];
vector <int> v[N];

bool cmp(lol a, lol b){
	if(a.val == b.val)
		return a.idx < b.idx;
	return a.val < b.val;
}

int solve(int idx, int lvl, int dist){
	if(lvl == 1)
		return dist;
	lvl--;
	auto it = lower_bound(v[lvl].begin(), v[lvl].end(), idx) - v[lvl].begin();
	it--;
	if(it < 0)
		return N;
	return solve(v[lvl][it], lvl, dist + idx - v[lvl][it]);
}

int main(){
	in >> n;
	for(int i = 1; i <= n; i++){
		in >> a[i].val;
		a[i].idx = i;
	}
	sort(a + 1, a + n + 1, cmp);
	int l, r;
	l = r = 1;
	while(r <= n){
		++vf;
		while(r <= n && a[r].val == a[l].val)
			r++;
		for(int i = l; i < r; i++)
			v[vf].push_back(a[i].idx);
		l = r;
	}
	for(auto it : v[vf])
		mn = min(mn, solve(it, vf, 1));
	out << (mn == N ? -1 : mn);
	return 0;
}