Cod sursa(job #125053)

Utilizator DorinOltean Dorin Dorin Data 20 ianuarie 2008 11:07:41
Problema Inundatii Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda 3, Clasele 11-12 Marime 2.08 kb
# include <stdio.h>

# define input "inundatii.in"
# define output "inundatii.out"

# define max 50001

long rez,a[max][3],st1,st2,st3,dr1,dr2,dr3,mij1,mij2,mij3;
int n,i,j;
int gasit1,gasit2,gasit3;
long s1,s2,s3,ss1,ss2,ss3,sd1,sd2,sd3;

long modul(long a)
{
     return a >= 0 ? a : -a;
}
long val;

int main()
{
    freopen(input,"r",stdin);
    freopen(output,"w",stdout);
    
    scanf("%d",&n);
    
    for(i=1;i<=n;i++)
        scanf("%ld%ld%ld",&a[i][0],&a[i][1],&a[i][2]);
        
	st1 = a[n][0];
	dr1 = a[1][0];
	st2 = a[n][1];
	dr2 = a[1][1];
	st3 = a[n][2];
	dr3 = a[1][2];

	gasit1 = gasit2 = gasit3 = 0;
	rez= 0;
		   val =0;
    while(!gasit1 || !gasit2 || !gasit3)
    {
		   mij1 = (st1+dr1)>>1;
		   mij2 = (st2+dr2)>>1;
		   mij3 = (st3+dr3)>>1;
           
           s1 = s2 = s3 = 0;
           ss1 = ss2 = ss3 = 0;
           sd1 = sd2 = sd3 = 0;
           for(i=1;i<=n;i++)
           {
               if(!gasit1)
               {
				   s1+=modul(mij1-a[i][0] + i-1);
				   ss1+= modul(mij1-a[i][0]-1 + i-1);
				   sd1+= modul(mij1-a[i][0]+1 + i-1);
			   }
			   if(!gasit2)
			   {
				   s2+=modul(mij2-a[i][1] + i-1);
				   ss2+= modul(mij2-a[i][1]-1 + i-1);
				   sd2+= modul(mij2-a[i][1]+1 + i-1);
			   }
			   if(!gasit3)
			   {
				   s3+=modul(mij3-a[i][2] + i-1);
				   ss3+= modul(mij3-a[i][2]-1 + i-1);
				   sd3+= modul(mij3-a[i][2]+1 + i-1);
			   }
		   }
		   //x
		   if(!gasit1)
           if(ss1 >= s1 && sd1 >= s1)
           {
                  rez+=s1,gasit1=1;

		   }
		   else
			   if(ss1 < s1)
				   st1 = mij1;
			   else
				   dr1 = mij1;
		   //y
		   if(!gasit2)
		   if(ss2 >= s2 && sd2 >= s2)
		   {
				  rez+=s2,gasit2=1;

		   }
		   else
			   if(ss2 < s2)
				   st2 = mij2;
			   else
				   dr2 = mij2;
			//z
			if(!gasit3)
		   if(ss3 >= s3 && sd3 >= s3)
		   {
				  rez+=s3,gasit3=1;
				 
		   }
		   else
			   if(ss3 < s3)
				   st3 = mij3;
               else
                   dr3 = mij3;
    }

	printf("%ld",rez);

    return 0;
}