Cod sursa(job #125463)

Utilizator VmanDuta Vlad Vman Data 20 ianuarie 2008 12:57:38
Problema Inundatii Scor 100
Compilator cpp Status done
Runda preONI 2008, Runda 3, Clasele 11-12 Marime 1.11 kb
#include <stdio.h>

#define Nmax 50005

int N,x[Nmax],y[Nmax],z[Nmax],i;
long long st[Nmax],dr,minx,miny,minz;

inline long long minim(long long a,long long b) { return a<b?a:b; }

void citire()
{
 freopen("inundatii.in","r",stdin);
 scanf("%d",&N);
 for (i=1;i<=N;++i)
    	scanf("%d %d %d",&x[i],&y[i],&z[i]);
 fclose(stdin);
}

void solve()
{

 //mutare dupa x
 for (i=2;i<=N;++i)
    st[i]=st[i-1]+(i-1)*(x[i-1]-x[i]+1);
 minx=st[N];
 dr=0;
 for (i=N-1;i>0;--i)
     {
    dr=dr+(N-i)*(x[i]-x[i+1]+1);
    minx=minim(st[i]+dr,minx);
    }
 //mutare dupa y
 for (i=2;i<=N;++i)
    st[i]=st[i-1]+(i-1)*(y[i-1]-y[i]+1);
 miny=st[N];
 dr=0;
 for (i=N-1;i>0;--i)
     {
    dr=dr+(N-i)*(y[i]-y[i+1]+1);
    miny=minim(st[i]+dr,miny);
    }
 //mutare dupa z
  for (i=2;i<=N;++i)
    st[i]=st[i-1]+(i-1)*(z[i-1]-z[i]+1);
 minz=st[N];
 dr=0;
 for (i=N-1;i>0;--i)
     {
    dr=dr+(N-i)*(z[i]-z[i+1]+1);
    minz=minim(st[i]+dr,minz);
    }
}

int main()
{
 citire();
 solve();
 freopen("inundatii.out","w",stdout);
 printf("%lld",minx+miny+minz);
 fclose(stdout);
 return 0;
}