Cod sursa(job #1200484)

Utilizator enedumitruene dumitru enedumitru Data 22 iunie 2014 16:54:01
Problema Caramizi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.29 kb
#include <cstdio>
#include<algorithm>
#define ll long long
#define DIM 8192 
using namespace std;
ll s[1000010],v[1000010];
int n, m;
char ax[DIM+16];
int pz;
inline void cit(int &x)
{	x=0;
	while(ax[pz]<'0' || ax[pz]>'9')
		if(++pz==DIM)fread(ax, 1, DIM, stdin), pz=0;
	while(ax[pz]>='0' && ax[pz]<='9')
	{	x=x*10+ax[pz]-'0';
		if(++pz==DIM)fread(ax,1, DIM, stdin),pz=0;
	}
}
int main()
{	freopen ("caramizi.in","r",stdin);
    freopen ("caramizi.out","w",stdout);
	cit(n); cit(m);
    int c,i,maxc=0;
	for(i=1;i<=n;i++) {cit(c); maxc=max(maxc,c); v[c]++;}
	for(i=1;i<=maxc;i++) s[i]=s[i-1]+v[i-1]*(i-1);
	ll sum=s[maxc]+v[maxc]*maxc;
	for(i=maxc;i>0;i--) v[i]+=v[i+1];
	for(i=1;i<=maxc;i++) 
	{	s[i]=(s[i]+v[i]*i)/i*i;
		s[i]=max(s[i],s[i-1]);
	}
	n=sum/maxc;
	v[n+1]=s[maxc];
	for(i=n;i>0;i--) 
	{	v[i]=sum/i*i; 
		v[i]=max(v[i],v[i+1]);
	}
	while(m--)
	{	cit(c);
		if(c<=maxc) printf("%lld\n",s[c]); 
		else printf("%lld\n",max(sum/c*c,v[sum/c+1]));
	}
	return 0;
}
/*
#include <cstdio>
#define DIM 8192 
char ax[DIM+16];
int pz;
inline void cit(int &x)
{
            x=0;
            while(ax[pz]<'0' || ax[pz]>'9')
                        if(++pz==DIM)fread(ax, 1, DIM, stdin), pz=0;
            while(ax[pz]>='0' && ax[pz]<='9')
            {
                        x=x*10+ax[pz]-'0';
                        if(++pz==DIM)fread(ax,1, DIM, stdin),pz=0;
            }
}
******************
#include <algorithm>
#include <cstdio>
 
#define INF 1000005
#define DIM 200005
 
#define pr(a,b) ( a-((a/b)*b) )
#define max(a,b) ( (a>b) ? a : b )
#define ll long long
using namespace std;
 
ll Rez[INF],Size[INF];
ll Sum=-1;
 
int A[DIM];
int N,M,x;
 
int main()
{
    freopen ("caramizi.in","r",stdin);
    freopen ("caramizi.out","w",stdout);
     
    scanf ("%d%d",&N,&M);
    for (int i=1; i<=N; ++i)
        scanf ("%d",&A[i]);
    A[0]=1,A[N+1]=INF;
     
    sort (A,A+N+1);
   
    for (int i=0; i<=N; ++i)
    {
        Sum+=A[i];
        for (ll j= A[i]  ; j<A[i+1]; ++j)
            Rez[j]=max (Rez[j-1], Sum-Sum%j+(N-i)*j);
    }
    for (int i=Sum/A[N]; i; --i)
        Size[i]=max (Sum-pr(Sum,i),Size[i+1]);
 
    for ( ;M;--M )
    {
        scanf ("%d",&x);
        printf ("%lld\n",(x<INF) ? Rez[x] : Size[Sum/x+1]);
    }
}
*/