Cod sursa(job #125431)

Utilizator petrePajarcu Alexandru-Petrisor petre Data 20 ianuarie 2008 12:51:52
Problema Inundatii Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda 3, Clasele 11-12 Marime 1.61 kb
#include <stdio.h>
long x[50001],y[50001],z[50001],st[50001],dr[50001],min,mini,p;
int n,i,j,k,l,m;

int main()
{
    freopen("inundatii.in","r",stdin);
    freopen("inundatii.out","w",stdout);
    scanf("%d",&n);
    for (i=1;i<=n;++i)
         scanf("%ld %ld %ld",&x[i],&y[i],&z[i]);
         
    st[1]=0;
    for (i=2;i<=n;++i)
        {

         st[i]=st[i-1]+x[i-1]-x[i]+y[i-1]-y[i]+z[i-1]-z[i];
         }
    dr[n]=0;
    for (i=n-1;i>=1;--i)
        {
        dr[i]=dr[i+1]+x[i]-x[i+1]+y[i]-y[i+1]+z[i]-z[i+1];
        }
    min=2000000000;
    for (i=1;i<=n-1;++i)
        {
        if (x[i]-x[i+1]<=z[i]-z[i+1] && x[i]-x[i+1]<=y[i]-y[i+1]) mini=x[i]-x[i+1];
        if (y[i]-y[i+1]<=z[i]-z[i+1] && x[i]-x[i+1]>=y[i]-y[i+1]) mini=y[i]-y[i+1];
        if (x[i]-x[i+1]>=z[i]-z[i+1] && z[i]-z[i+1]<=y[i]-y[i+1]) mini=z[i]-z[i+1];
        p=st[i]*((i*(i-1)*3)/2)+dr[i]*(((n-i)*(n-i+1)*3)/2);
        if (p<min) min=p;
         for (j=0;j<=mini;++j)
             {if (p+3*j*(2*i-n)<min) min=p+3*j*(2*i-n);}
        }
    for (i=n;i>1;--i)
        {
        if ((-x[i]+x[i-1]<=-z[i]+z[i-1]) && (-x[i]+x[i-1]<=-y[i]+y[i-1])) mini=-x[i]+x[i-1];
        if ((-y[i]+y[i-1]<=-z[i]+z[i-1]) && (-x[i]+x[i-1]>=-y[i]+y[i-1])) mini=-y[i]+y[i-1];
        if ((-x[i]+x[i-1]>=-z[i]+z[i-1]) && (-z[i]+z[i-1]<=-y[i]+y[i-1])) mini=-z[i]+z[i-1];
        p=st[i]*((i*(i-1)*3)/2)+dr[i]*(((n-i)*(n-i+1)*3)/2);
        if (p<min) min=p;
         for (j=0;j<=mini;++j)
             {if (p+3*j*(n-2*i)<min)  min=p+3*j*(-2*i+n);}
        }
    printf("%ld",min);
    fclose(stdin);
    fclose(stdout);
    return(0);
}