Cod sursa(job #2862179)

Utilizator mateitudordmDumitru Matei mateitudordm Data 4 martie 2022 23:22:06
Problema Caramizi Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <fstream>
#include <algorithm>
#define nmax 200000LL
#define cmax 1000000LL
#define int long long

using namespace std;

const int inf = 1e9;

struct lol
{
    int val, poz, sol;
};
bool cmpval ( lol a, lol b )
{
    return a.val < b.val;
}
bool cmpinit ( lol a, lol b )
{
    return a.poz < b.poz;
}

lol q[nmax + 2];
int v[nmax + 2], f[cmax + 1], cat[cmax + 2], fst[cmax + 2], catdr[cmax + 2];
// toate frecv sub l(i) trebuie adaugate in mod normal, toate frecv peste l[i] trebuie rotunjite la l(i)

signed main()
{
    ifstream cin ( "caramizi.in" );
    ofstream cout ( "caramizi.out" );
    int i, n, m, maxx = 0, p = 1, caramizi;
    cin >> n >> m;
    for ( i = 1; i <= n; i++ )
        cin >> v[i], f[v[i]] += v[i], cat[v[i]]++;
    for (i = 1; i <= cmax; i++)
        f[i] += f[i - 1];
    for (i = cmax - 1; i >= 1; i--)
        cat[i] += cat[i + 1];
    for ( i = 1; i <= m; i++ )
        cin >> q[i].val, q[i].poz = i;
    sort ( q + 1, q + m + 1, cmpval );
    for ( i = 1; i <= min (cmax, q[m].val); i++ )
    {
        caramizi = f[i] + cat[i + 1] * i;
        caramizi /= i;
        caramizi *= i;
        if (caramizi > maxx)
            maxx = caramizi;
        while ( q[p].val == i )
            q[p++].sol = maxx;
    }
    while (p <= m)
        q[p++].sol = maxx;
    sort ( q + 1, q + m + 1, cmpinit );
    for ( i = 1; i <= m; i++ )
        cout << q[i].sol << '\n';
    return 0;
}