Pagini recente » Cod sursa (job #703973) | Istoria paginii runda/brasov_7_jr/clasament | Cod sursa (job #2591840) | Cod sursa (job #1718880) | Cod sursa (job #2148740)
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
struct per{
int num,poz;
}v[5005];
int nr[5005];
int dp[5005];
vector<int>poz[5005];
int cmp(per a,per b){
return a.num<b.num;}
int main(){
freopen("secv.in","r",stdin);
freopen("secv.out","w",stdout);
int n,i,x,j,st,dr,mij,last;
scanf("%d",&n);
if (n==0){
printf("0\n");
return 0;}
for(i=1;i<=n;i++)
scanf("%d",&v[i].num),v[i].poz=i;
sort(v+1,v+n+1,cmp);
int u=0;
v[0].num=-1;
for(i=1;i<=n;i++)
if (v[i].num==v[i-1].num)
nr[v[i].poz]=u;
else
nr[v[i].poz]=++u;
for(i=1;i<=n;i++)
poz[nr[i]].push_back(i);
for(j=0;j<poz[1].size();j++)
dp[poz[1][j]]=1;
for(i=2;i<=u;i++){
for(j=0;j<poz[i].size();j++){
st=0;
dr=poz[i-1].size()-1;
last=-1;
while(st<=dr){
mij=(st+dr)/2;
if (poz[i-1][mij]<poz[i][j]){
last=mij;
st=mij+1;}
else
dr=mij-1;}
if (last==-1 || dp[poz[i-1][last]]==-1)
dp[poz[i][j]]=-1;
else
dp[poz[i][j]]=dp[poz[i-1][last]]+poz[i][j]-poz[i-1][last];}}
int minim=2000000000;
for(i=0;i<poz[u].size();i++)
if (dp[poz[u][i]]<minim && dp[poz[u][i]]!=-1)
minim=dp[poz[u][i]];
if (minim==2000000000)
printf("-1\n");
else
printf("%d\n",minim);
return 0;}