Submission #1300291

#TimeUsernameProblemLanguageResultExecution timeMemory
1300291javahirbekKnapsack (NOI18_knapsack)C++20
73 / 100
1095 ms656 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <deque>

using namespace std;

void solve() {
    int S, N;
    if (!(cin >> S >> N)) return;

    vector<long long> dp(S + 1, 0);

    for (int i = 0; i < N; ++i) {
        long long v, w, c;
        if (!(cin >> v >> w >> c)) return;

        if (c * w >= S) {
            for (int j = w; j <= S; ++j) {
                dp[j] = max(dp[j], dp[j - w] + v);
            }
        } 
        else {
            for (int r = 0; r < w; ++r) {
                deque<pair<int, long long>> q;
                
                int max_k = (S - r) / w;

                for (int k = 0; k <= max_k; ++k) {
                    int idx = r + k * w;
                    
                    long long val = dp[idx] - (long long)k * v;
                    
                    while (!q.empty() && q.back().second <= val) {
                        q.pop_back();
                    }
                    q.push_back({k, val});

                    while (!q.empty() && q.front().first < k - c) {
                        q.pop_front();
                    }
                    
                    dp[idx] = max(dp[idx], q.front().second + (long long)k * v);
                }
            }
        }
    }

    cout << dp[S] << endl;
}

int main() {
    solve();
    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...