Cod sursa(job #2734564)

Utilizator rares404AlShaytan - Balasescu Rares rares404 Data 1 aprilie 2021 08:39:54
Problema Caramizi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.93 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;
}