Nu aveti permisiuni pentru a descarca fisierul grader_test14.ok
Cod sursa(job #199540)
Utilizator | Data | 19 iulie 2008 12:29:39 | |
---|---|---|---|
Problema | Barman | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 2.52 kb |
#include<stdio.h>
long n,i,m,a[700],o[700],b[700],sol,c[700],
a1[700][700],b1[700][700];
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+=aa[L];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;
}
}