Cod sursa(job #1576468)

Utilizator Athena99Anghel Anca Athena99 Data 22 ianuarie 2016 14:57:17
Problema Caramizi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <algorithm>
#include <cassert>
#include <cstdio>

using namespace std;

typedef long long i64;

const i64 nmax= 200000;
const i64 vmax= 1000000;

i64 c[nmax+10], d[vmax+10], d2[vmax+10];

int main(  ) {
    assert( freopen( "caramizi.in", "r", stdin ) );
    assert( freopen( "caramizi.out", "w", stdout ) );

    i64 n, m;
    assert( scanf( "%lld%lld", &n, &m ) );
    for ( i64 i= 1; i<=n; ++i ) {
        assert( scanf( "%lld", &c[i] ) );
    }
    sort( c+1, c+n+1 );
    c[0]= 1, c[n+1]= vmax+1;

    i64 aux= -1;
    for ( i64 i= 0; i<=n; ++i ) {
        aux= aux+c[i];
        for ( i64 j= c[i]; j<=c[i+1]-1; ++j ) {
            d[j]= max(d[j-1], (aux/j+n-i)*j);
        }
    }

    for ( i64 i= aux/c[n]; i>=1; --i ) {
        d2[i]= max(d2[i+1], aux-aux%i);
    }

    for ( i64 cnt= 1; cnt<=m; ++cnt ) {
        i64 y, sol= 0;
        assert( scanf( "%lld", &y ) );
        if ( y<=vmax ) {
            sol= d[y];
        } else {
            sol= d2[aux/y+1];
        }

        printf( "%lld\n", sol );
    }

    return 0;
}