Cod sursa(job #125139)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 20 ianuarie 2008 11:36:28
Problema Inundatii Scor 10
Compilator cpp Status done
Runda preONI 2008, Runda 3, Clasele 11-12 Marime 1.5 kb
#include<stdio.h>
long int n,i,x[50001],y[50001],z[50001],a[50001],s[50001],min,sol,aux;
void swap(long int i1,long int i2);
void heapdown(long int ic,long int nc);
int main()
{
	FILE *f,*g;f=fopen("inundatii.in","r");g=fopen("inundatii.out","w");
	fscanf(f,"%ld",&n);
	for(i=1;i<=n;i++)fscanf(f,"%ld%ld%ld",&x[i],&y[i],&z[i]);
	for(i=1;i<=n;i++)a[i]=x[i]-i+1;
	for(i=n/2;i>=1;i--)heapdown(i,n);
	for(i=n;i>=1;i--){swap(1,i);heapdown(1,i-1);}
	for(i=1;i<=n;i++)s[i]=s[i-1]+a[i];
	min=s[n]-2*s[1]+(2-n)*a[1];
	for(i=1;i<=n;i++)
	 if((s[n]-2*s[i]+(2*i-n)*a[i])<min)
	  min=s[n]-2*s[i]+(2*i-n)*a[i];
	sol=sol+min;
	for(i=1;i<=n;i++)a[i]=y[i]-i+1;
	for(i=n/2;i>=1;i--)heapdown(i,n);
	for(i=n;i>=1;i--){swap(1,i);heapdown(1,i-1);}
	for(i=1;i<=n;i++)s[i]=s[i-1]+a[i];
	min=s[n]-2*s[1]+(2-n)*a[1];
	for(i=1;i<=n;i++)
	 if((s[n]-2*s[i]+(2*i-n)*a[i])<min)
	  min=s[n]-2*s[i]+(2*i-n)*a[i];
	sol=sol+min;
	for(i=1;i<=n;i++)a[i]=z[i]-i+1;
	for(i=n/2;i>=1;i--)heapdown(i,n);
	for(i=n;i>=1;i--){swap(1,i);heapdown(1,i-1);}
	for(i=1;i<=n;i++)s[i]=s[i-1]+a[i];
	min=s[n]-2*s[1]+(2-n)*a[1];
	for(i=1;i<=n;i++)
	 if((s[n]-2*s[i]+(2*i-n)*a[i])<min)
	  min=s[n]-2*s[i]+(2*i-n)*a[i];
	sol=sol+min;
	fprintf(g,"%ld\n",sol);
	fcloseall();
	return 0;
}
void swap(long int i1,long int i2)
{
	aux=a[i1];a[i1]=a[i2];a[i2]=aux;
}
void heapdown(long int ic,long int nc)
{
	long int is,is1;
	is=2*ic;is1=2*ic+1;
	if(is>nc)return;
	if(is<nc)if(a[is1]>a[is])is=is1;
	if(a[is]>a[ic]){swap(is,ic);heapdown(is,nc);}
}