Cod sursa(job #197924)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 7 iulie 2008 11:23:25
Problema Lapte Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include<stdio.h>
long t[101],c[101],ta[101],tb[101],ca[101],cb[101],sa[101],sb[101],
A,B,l,i,n;
void heapup(long ic);
void heapdown(long ic);
void swap(long i1,long i2);
void beau_a();
void beau_b();
int main()
{
	freopen("lapte.in","rt",stdin);
	freopen("lapte.out","wt",stdout);
	scanf("%ld%ld",&n,&l);
	for(i=1;i<=n;i++)
	{ scanf("%d%d",&ta[i],&tb[i]);
	  ca[i]=l;cb[i]=l;t[i]=ca[i]*ta[i]+cb[i]*tb[i];
	  c[i]=i;heapup(i);A+=l;B+=l;
	}
	while(A>l&&B>l)
	{ if(!ca[1]){ beau_b();continue;}
	  if(!cb[1]){ beau_a();continue;}
	  if(ta[1]>tb[1]){ beau_a();continue;}
	  if(ta[1]<tb[1]){beau_b();continue;}
	  if(A>B){beau_a();continue;}
	  beau_b();continue;
	}
	while(A>l)
	{ if(!ca[1])break;beau_a();}
	while(B>l)
	{ if(!cb[1])break;beau_b();}
	for(i=1;i<=n;i++){ sa[c[i]]=ca[i];sb[c[i]]=cb[i];}
	printf("%ld\n",t[1]);
	for(i=1;i<=n;i++)printf("%ld %ld\n",sa[i],sb[i]);
	return 0;
}
void heapup(long ic)
{
	long is=ic>>1;
	if(!is)return;
	if(t[is]<t[ic]){swap(is,ic);heapup(is);}
}
void heapdown(long ic)
{
	long is,is1;
	is=ic<<1;is1=is|1;
	if(is>n)return;
	if(is<n)if(t[is1]>t[is])is=is1;
	if(t[is]>t[ic]){swap(is,ic);heapdown(is);}
}
void swap(long i1,long i2)
{
	long
	aux=c[i1];c[i1]=c[i2];c[i2]=aux;
	aux=t[i1];t[i1]=t[i2];t[i2]=aux;
	aux=ta[i1];ta[i1]=ta[i2];ta[i2]=aux;
	aux=tb[i1];tb[i1]=tb[i2];tb[i2]=aux;
	aux=ca[i1];ca[i1]=ca[i2];ca[i2]=aux;
	aux=cb[i1];cb[i1]=cb[i2];cb[i2]=aux;
}
void beau_a()
{ ca[1]--;t[1]-=ta[1];A--;heapdown(1);}
void beau_b()
{ cb[1]--;t[1]-=tb[1];B--;heapdown(1);}