Pagini recente » Cod sursa (job #3188020) | Cod sursa (job #2046942) | Cod sursa (job #485260) | Cod sursa (job #2254001) | Cod sursa (job #1040837)
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
vector<int> srt;
vector<int> pos[5005];
int vals[5005], dp[5005], lst[5005];
int bs1(int x){
int left = 0, right = srt.size() - 1, mid;
while(left <= right){
mid = (left + right) >> 1;
if(srt[mid] == x)
return mid;
if(srt[mid] > x)
right = mid - 1;
else
left = mid + 1;
}
return -1;
}
int main(){
ifstream in("secv.in");
ofstream out("secv.out");
int n;
set<int> vis;
in >> n;
for(int i = 1; i <= n; ++i){
in >> vals[i];
if(vis.find(vals[i]) == vis.end()){
srt.push_back(vals[i]);
vis.insert(vals[i]);
}
}
sort(srt.begin(), srt.end());
for(int i = 1; i <= n; ++i){
vals[i] = bs1(vals[i]);
pos[vals[i]].push_back(i);
}
int ans = 2e9;
for(int i = 1; i <= n; ++i){
if(vals[i] == 0){
dp[i] = 1;
if(dp[i] && vals[i] == srt.size() - 1)
ans = min(ans, dp[i]);
lst[0] = i;
continue;
}
int t = lst[vals[i] - 1];
if(t == 0)
continue;
dp[i] = dp[t] + i - t;
lst[vals[i]] = i;
if(dp[i] && vals[i] == srt.size() - 1)
ans = min(ans, dp[i]);
}
if(ans == 2e9)
ans = -1;
out << ans;
return 0;
}