Submission #1278936

#TimeUsernameProblemLanguageResultExecution timeMemory
1278936SSKMFKnapsack (NOI18_knapsack)C++20
73 / 100
1006 ms588 KiB
#include <bits/stdc++.h>
using namespace std;

vector < pair <int , int> > candidati[2001];
int maxim[2001] , temporar[2001] , stanga[2001];

int main ()
{
    ios :: sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);

    int limita , optiuni;
    cin >> limita >> optiuni;

    for (int indice = 1 ; indice <= limita ; indice++)
        { maxim[indice] = -1; }

    while (optiuni--)
    {
        int valoare , greutate , __limita;
        cin >> valoare >> greutate >> __limita;

        for (int indice = 0 ; indice < greutate ; indice++)
            { candidati[indice].clear(); stanga[indice] = 0; }

        for (int indice = 0 , __indice = 0 ; indice <= limita ; indice++)
        {
            if (stanga[__indice] < (int)candidati[__indice].size() && (indice - candidati[__indice][stanga[__indice]].second) / greutate > __limita)
                { stanga[__indice]++; }

            temporar[indice] = max(maxim[indice] , stanga[__indice] >= (int)candidati[__indice].size() ? -1 : candidati[__indice][stanga[__indice]].first + indice / greutate * valoare);

            if (maxim[indice] != -1)
            {
                pair <int , int> actual = {maxim[indice] - indice / greutate * valoare , indice};
                while (stanga[__indice] < (int)candidati[__indice].size() && candidati[__indice].back().first <= actual.first)
                    { candidati[__indice].pop_back(); }

                candidati[__indice].push_back(actual);
            }

            if (++__indice == greutate)
                { __indice = 0; }
        }
        
        for (int indice = 0 ; indice <= limita ; indice++)
            { maxim[indice] = temporar[indice]; }
    }

    int rezultat = 0;
    for (int indice = 1 ; indice <= limita ; indice++)
        { rezultat = max(rezultat , maxim[indice]); }
    
    cout << rezultat;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...