Cod sursa(job #2824269)

Utilizator toma_ariciuAriciu Toma toma_ariciu Data 31 decembrie 2021 20:25:31
Problema Carnati Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("carnati.in");
ofstream fout("carnati.out");

struct client {
    long long timp, val;
}v[2005], h[2005];

long long n, k, c[1505], maxt = -1, ans;

void mergesort(long long st, long long dr)
{
    if(st == dr)
        return;
    long long med = (st + dr) / 2;
    mergesort(st, med);
    mergesort(med + 1, dr);
    long long i = st, j = med + 1, k = st;
    while(i <= med || j <= dr)
    {
        if(j > dr || (i <= med && v[i].val > v[j].val))
            h[k++] = v[i++];
        else
            h[k++] = v[j++];
    }
    for(i = st; i <= dr; i++)
        v[i] = h[i];
}

long long calc(long long pret)
{
    long long a, dp = 0, sol = 0;
    for(long long i = 1; i <= maxt; i++)
    {
        a = c[i] * pret - k;
        dp += a;
        if(dp > sol)
            sol = dp;
        if(dp < 0)
            dp = 0;
    }
    return sol;
}

int main()
{
    fin >> n >> k;
    for(long long i = 1; i <= n; i++)
    {
        fin >> v[i].timp >> v[i].val;
        maxt = max(maxt, v[i].timp);
    }
    mergesort(1, n);
    for(long long i = 1; i <= maxt; i++)
        c[i] = 0;
    for(long long i = 1; i <= maxt; i++)
    {
        c[v[i].timp]++;
        ans = max(ans, calc(v[i].val));
    }
    fout << ans;
    return 0;
}