Cod sursa(job #1089546)

Utilizator IonMosnoiIon Mosnoi IonMosnoi Data 21 ianuarie 2014 19:22:10
Problema Secv Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <stdio.h>
#include<algorithm>

const int nmax = 5300;

using namespace std;
int a[nmax],n,b[nmax][nmax],c[nmax][nmax],d[nmax],u[nmax],sol=-1,l[nmax],max1=-1,pr[20000000],nr=0,f;



main(){
 
     freopen("secv.in","r",stdin);
     freopen("secv.out","w",stdout);      
 scanf("%d ",&n);
 int min = 2000000000;
for(int i=1;i<=n;i++){
	scanf("%d ",&a[i]);
	if(pr[a[i]]!=1)nr++;
	pr[a[i]]=1;
	if(min>a[i])min=a[i];
}
int k = 1;
for(int i=1;i<=n;i++){
if(min==a[i]){
	d[k]=i; k++;
}
	
}

for(int i=1;i<k;i++){
  b[i][d[i]]=1; int h=d[i]+1; int j  = d[i]; u[i]=1;
     while(h<=n){
     	if(a[h]>a[j]){
     		b[i][h]=b[i][j]+1;
	     	bool ok = true; int z=h+1;
	     	while(ok && z<=n){
	     		if(a[z]<a[h] && a[z]>a[j]){
	     			ok = false; //printf(" %d %s",z,"\n");
	     		}else
	     		z++;
	     	}
			 if(ok){
			 j=h	; h++; 
			 }
			 else 	{
			 b[i][z]=b[i][j]+1;	j=z; h = z+1;
			 }
			 u[i]++;l[i]=h;
			 if(max1<u[i])max1=u[i];
     	}else h++;
     
     }
    
}

for(int i=1;i<k;i++){
  //for(int j=1;j<=n;j++)	printf("%d ",b[i][j]);
  //printf(" %d %d %d %s",u[i],l[i],d[i],"\n");
   if((sol>(l[i]-d[i]) || sol==-1) && nr==u[i] && l[i]-d[i]>0){
   	sol=l[i]-d[i]; f=i;
   }
}


if(nr!=max1)sol=-1;
printf("%d",sol);
	 
}