Cod sursa(job #199534)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 19 iulie 2008 12:25:08
Problema Barman Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.5 kb
#include<stdio.h>
long n,i,m,a[700],o[700],b[700],sol,c[700],
a1[7][7],b1[7][7];
void citire();
void sortare();
void hd(long ic,long nc);
void sh(long i1,long i2);
void normalizare();
void alocare();
void rezolvare();
void afisare();
int main()
{
	citire();
	sortare();
	normalizare();
	alocare();
	rezolvare();
	afisare();
	return 0;
}
void citire()
{
	freopen("barman.in","rt",stdin);
	scanf("%ld",&n);
	for(i=1;i<=n;i++){ scanf("%ld",&a[i]);o[i]=i;b[i]=a[i];}
}
void sortare()
{     for(i=n/2;i>=1;i--)hd(i,n);
      for(i=n;i>=1;i--){sh(1,i);hd(1,i-1);}
}
void hd(long ic,long nc)
{	long is,is1;
	is=2*ic;is1=2*ic+1;
	if(is>nc)return;
	if(is<nc) if(a[is1]>a[is]||(a[is]==a[is1]&&o[is]<o[is1]))is=is1;
	if(a[is]>a[ic]||(a[is]==a[ic]&&o[is]>o[ic])){sh(is,ic);hd(is,nc);}
}
void sh(long i1,long i2)
{	long aux;
	aux=a[i1];a[i1]=a[i2];a[i2]=aux;
	aux=o[i1];o[i1]=o[i2];o[i2]=aux;
}
void normalizare()
{	long val=a[1],nval=1;
	for(i=1;i<=n;i++)
	{ if(a[i]!=val){val=a[i];nval++;}
	  a[i]=nval;b[o[i]]=nval;c[nval]++;
	}
	m=nval;
	for(i=1;i<=n;i++)a[i+n]=a[i];
}
void afisare()
{
	freopen("barman.out","wt",stdout);
	printf("%ld\n",sol);
}
void alocare()
{
	for(i=1;i<=m;i++)c[i]=0;
	for(i=1;i<=n;i++) a1[a[i]][++c[a[i]]]=i;
	for(i=1;i<=m;i++) c[i]=0;
	for(i=1;i<=n;i++) b1[b[i]][++c[b[i]]]=i;
}
void rezolvare()
{       long u,j,k,ia,ib,na,nb,aa[2100],bb[700],sc,dif,L,R,PB,s1,s2;
	sol=1000000000;
	for(i=0;i<n;i++)
	{ u=a[n-i];
	  sc=0;
	  for(j=1;j<u;j++)
	   for(k=1;k<=c[j];k++)
	    a1[j][k]++;
	  for(j=u+1;j<=m;j++)
	   for(k=1;k<=c[j];k++)
	    a1[j][k]++;
	  for(k=2;k<=c[u];k++)
	   a1[u][k]=a1[u][k-1]+1;
	  a1[u][1]=1;
	  for(j=1;j<=m;j++)
	  { ia=1;ib=1;na=0;nb=0;
	    while(ia<=c[j]&&ib<=c[j])
	    { if(a1[j][ia]<b1[j][ib])
	      { aa[++na]=a1[j][ia];ia++;continue;}
	      if(b1[j][ib]<a1[j][ia])
	      { bb[++nb]=b1[j][ib];ib++;continue;}
	      ia++;ib++;
	    }
	    while(ia<=c[j]){aa[++na]=a1[j][ia];ia++;}
	    while(ib<=c[j]){bb[++nb]=b1[j][ib];ib++;}
	    if(!na)continue;
	    s2=20*na;
	    for(k=1;k<=na;k++)aa[k]-=n;
	    for(k=1;k<=2*na;k++) aa[k+na]=aa[k]+n;
	    for(k=1;k<=na;k++)
	    { s2+=bb[k];s2-=aa[k];}
	    L=1;R=na+1;PB=na;
	    s1=s2;
	    while(R<=3*na)
	    { if(aa[R]<bb[na]){s1+=aa[L];s1-=aa[R];}
	      else
	      if(a[L]<bb[na]){ s1-=bb[PB];s1-=bb[PB];s1+=aa[R];PB--;}
	      else {s1-=aa[L];s1+=aa[R];}
	      L++;R++;
	      s2=(s2<s1)?s2:s1;
	    }
	    sc+=s2;
	  }
	  sol=(sol<sc)?sol:sc;
	}
}