Cod sursa(job #125280)

Utilizator VmanDuta Vlad Vman Data 20 ianuarie 2008 12:23:34
Problema Inundatii Scor 100
Compilator cpp Status done
Runda preONI 2008, Runda 3, Clasa a 10-a Marime 1.16 kb
#include <stdio.h>

#define Nmax 50005

int N,x[Nmax],y[Nmax],z[Nmax],i;
long long st[Nmax],dr[Nmax],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);
 for (i=N-1;i>0;--i)
    dr[i]=dr[i+1]+(N-i)*(x[i]-x[i+1]+1);
 minx=st[1]+dr[1];
 for (i=2;i<=N;++i)
    minx=minim(st[i]+dr[i],minx);
 //mutare dupa y
 for (i=2;i<=N;++i)
    st[i]=st[i-1]+(i-1)*(y[i-1]-y[i]+1);
 for (i=N-1;i>0;--i)
    dr[i]=dr[i+1]+(N-i)*(y[i]-y[i+1]+1);
 miny=st[1]+dr[1];
 for (i=2;i<=N;++i)
    miny=minim(st[i]+dr[i],miny);
 //mutare dupa z
  for (i=2;i<=N;++i)
    st[i]=st[i-1]+(i-1)*(z[i-1]-z[i]+1);
 for (i=N-1;i>0;--i)
    dr[i]=dr[i+1]+(N-i)*(z[i]-z[i+1]+1);
 minz=st[1]+dr[1];
 for (i=2;i<=N;++i)
    minz=minim(st[i]+dr[i],minz);
}

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