Cod sursa(job #1759379)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 18 septembrie 2016 23:08:56
Problema Caramizi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <cstdio>
#include <cctype>
#include <algorithm>

#define BUF_SIZE 1<<17
#define MAXN 200001
#define MAXC 1000000

int v[MAXN+1], h[MAXC+1];
long long s[MAXN+1], d[MAXC+1], u[MAXN+3];

int pos=BUF_SIZE;
char buf[BUF_SIZE];
FILE *fin;

inline char nextch(){
    if(pos==BUF_SIZE) fread(buf, BUF_SIZE, 1, fin), pos=0;
    return buf[pos++];
}

inline int read(){
    int x=0;
    char ch=nextch();
    while(!isdigit(ch)) ch=nextch();
    while(isdigit(ch)){
        x=10*x+ch-'0';
        ch=nextch();
    }
    return x;
}

inline long long max2(long long a, long long b){
    if(a>b) return a;
    else return b;
}

int main(){
    int n, i, q, j, x;
    long long ans;
    FILE *fout;
    fin=fopen("caramizi.in", "r");
    fout=fopen("caramizi.out", "w");
    n=read();
    q=read();
    for(i=1; i<=n; i++)
        v[i]=read();
    v[n+1]=MAXC;
    std::sort(v+1, v+n+1);
    for(i=1; i<=n; i++)
        s[i]=s[i-1]+v[i];
    for(i=1; i<=n+1; i++){
        for(j=v[i-1]+1; j<=v[i]; j++){
            h[j]=n-i+1+s[i-1]/j;
            d[j]=max2(d[j-1], 1LL*j*h[j]);
        }
    }
    for(i=s[n]/v[n]; i>0; i--)
        u[i]=max2(u[i+1], s[n]-s[n]%i);
    for(i=1; i<=q; i++){
        x=read();
        if(x<=v[n+1]) ans=d[x];
        else ans=u[s[n]/x+1];
        fprintf(fout, "%lld\n", ans);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}