Cod sursa(job #257852)

Utilizator carlopCarlo Piovesan carlop Data 14 februarie 2009 02:02:15
Problema Caramizi Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include<iostream>
#include<stdio.h>
#define max(a,b) (a>b?a:b)
FILE *f=fopen("caramizi.in","r"),*g=fopen("caramizi.out","w");
long n,m;
long long a[200000],n1,b[200000],sol[1000005],i,j,max1,poz,aux,ant,ant1,sum,c[1000005],sol2[200000],tow[200000],res[200000];
void qsort(long long st,long long dr)
{
	long long i=st,j=dr,c=a[(st+dr)/2],aux;
	do
	{
		while(i<=j&&a[i]<c) i++;
		while(i<=j&&a[j]>c) j--;
		if(i<=j)
		{
			aux=a[i];a[i]=a[j];a[j]=aux;
			i++;j--;
		}
	}while(i<=j);
	if(st<j) qsort(st,j);
	if(i<dr) qsort(i,dr);
}
int main()
{
    fscanf(f,"%ld%ld",&n,&m);  
    for(i=1;i<=n;i++)  
        fscanf(f,"%lld",&a[i]);  
    qsort(1,n);  
    for(i=1;i<=m;i++)  
    {  
        fscanf(f,"%lld",&b[i]);  
        max1=max(max1,b[i]);  
    }
    for(i=1,poz=1;i<=1000000;i++)  
    {  
        while(a[poz]<=i&&poz<n+1)  
            sum+=a[poz++];  
        aux=sum/i*i;  
        sol[i]=(n-poz+1)*i+aux;  
        sol[i]=max(sol[i],sol[i-1]);  
    }  
	if(max1<=1000000)
	for(i=1;i<=m;i++)
		fprintf(g,"%lld\n",sol[b[i]]);
	else
        {
	     sol2[n+1]=sol[1000000];tow[n+1]=1000000;
	     for(i=n;i;i--)
	     {
		 tow[i]=sum/i;
		 sol2[i]=tow[i]*i;
		 if(sol2[i]<sol2[i+1])
		 {
		      sol2[i]=sol2[i+1];tow[i]=tow[i+1];
		 }
	     }
	     for(i=1;i<=m;i++)
	     {
		if(b[i]<=1000000) res[i]=sol[b[i]];
		else if(b[i]>=sum) res[i]=sum;
		else{
		     long long min4=1,max4=n+1,mij;;
		     while(min4+1<max4)
		     { mij=min4+(max4-min4)/2;
		       if(tow[mij]>b[i]) min4=mij;
		       else  max4=mij;
		     }
		     res[i]=max(sol2[max4],min4*b[i]);
                     }
	    }
	 for(i=1;i<=m;i++)
	   fprintf(g,"%lld\n",res[i]);
	}
	return 0;
}