Cod sursa(job #1576820)

Utilizator akaprosAna Kapros akapros Data 22 ianuarie 2016 21:21:07
Problema Caramizi Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <bits/stdc++.h>
#define ll long long
#define maxN 200002
using namespace std;
int n, m, maxv , v[maxN];
ll nb[maxN], nB[maxN], s[maxN];
void read()
{
    int i;
    freopen("caramizi.in", "r", stdin);
    scanf("%d %d", &n, &m);
    for (i = 1; i <= n; ++ i)
    {
        scanf("%d", &v[i]);
        if (maxv < v[i])
        maxv = v[i];
    }
}
void solve()
{
    int i, p = 1;
    maxv = 200000;
    sort(v + 1, v + n + 1);
    for (i = 1; i <= n; ++ i)
        s[i] = s[i - 1] + v[i];
    for (i = 1; i <= maxv; ++ i)
    {
        while (i > v[p] && p <= n)
            ++ p;
        ll vi = 1LL * s[p - 1] + 1ll * (n - p + 1) * i;
        nb[i] = max(nb[i - 1], vi - vi % i);
    }
}
void write()
{
    freopen("caramizi.out", "w", stdout);
    ll sum = s[n] - 1;
    int i, x;
    for (i = sum / v[n]; i >= 1; -- i)
        nB[i] = max(nB[i + 1], sum - sum % i);
    while (m --)
    {
        scanf("%d", &x);
        if (x <= maxv)
            printf("%lld\n", nb[x]);
        else
            printf("%lld\n", nB[(sum / x) + 1]);
    }
}
int main()
{
    read();
    solve();
    write();
    return 0;
}