Submission #1223248

#TimeUsernameProblemLanguageResultExecution timeMemory
1223248eduardmmKnapsack (NOI18_knapsack)C++20
73 / 100
1096 ms2632 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int main(){

    cin.tie(0)->sync_with_stdio(0);

    int n, s;
    cin >> s >> n;

    vector<ll> v(n), w(n), k(n);
    for (int i = 0; i < n; ++i){
        cin >> v[i] >> w[i] >> k[i];
    }

    vector<ll> dp(s + 1, -1);
    dp[0] = 0;
    for (int i = 0; i < n; ++i){
        vector<ll> index(w[i], 3000);
        vector<deque<ll>> best(w[i]);
        for (int j = s; j >= 0; --j){
            int ind = j % w[i];
            if (index[ind] == 3000) index[ind] = j;
            while (index[ind] >= 0 && (j - index[ind])/w[i] <= k[i]){
                int z = index[ind];
                ll val = dp[z] + ((s - z)/w[i])*v[i];
                index[ind] -= w[i];
                while (dp[z] >= 0 && !best[ind].empty() && best[ind].back() < val){
                    best[ind].pop_back();
                }
                if (dp[z] >= 0) best[ind].push_back(val);
            }
            ll mult = ((s - j)/w[i])*v[i];
            ll u = dp[j] + mult;
            if (!best[ind].empty() && best[ind].front() == u) best[ind].pop_front();
            if (!best[ind].empty()){
                ll v = best[ind].front() - mult;
                dp[j] = max(dp[j], v);
            }
        }
    }

    ll ans = 0;
    for (int i = 0; i <= s; ++i) ans = max(ans, dp[i]);
    cout << ans << '\n';

    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...