Submission #1164651

#TimeUsernameProblemLanguageResultExecution timeMemory
1164651crispxxKnapsack (NOI18_knapsack)C++20
73 / 100
1096 ms1604 KiB
#include <bits/stdc++.h>
using namespace std;

const int INF = 1e9;

void knapsackMonotoneQueue(int n, int W, vector<int>& w, vector<int>& v, vector<int>& k) {
    vector<int> f(W + 1);
    
    for (int i = 0; i < n; ++i) {
        int wi = w[i], vi = v[i], ki = k[i];
        
        vector<int> new_f = f;
        
        for (int y = 0; y < wi; ++y) { // Process all residue classes mod wi
            deque<int> dq;
            
            for (int x = 0; x * wi + y <= W; ++x) {
                int idx = x * wi + y;
                int G = f[idx] - x * vi;
                
                while (!dq.empty() && G >= f[dq.back()] - (dq.back() / wi) * vi)
                    dq.pop_back();
                dq.push_back(idx);
                
                if (!dq.empty() && x - (dq.front() / wi) > ki)
                    dq.pop_front();
                
                new_f[idx] = f[dq.front()] + (x - (dq.front() / wi)) * vi;
            }
        }
        
        swap(f, new_f);
    }
    
    cout << f[W] << endl;
}

int main() {
    int n, W;
    cin >> W >> n;
    vector<int> w(n), v(n), k(n);
    for (int i = 0; i < n; ++i) cin >> v[i] >> w[i] >> k[i];
    
    knapsackMonotoneQueue(n, W, w, v, k);
    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...