Submission #1298282

#TimeUsernameProblemLanguageResultExecution timeMemory
1298282rubykhoiKnapsack (NOI18_knapsack)C++20
73 / 100
1094 ms912 KiB
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
#define ffor(i,a,b) for(ll i=a;i<=b;i++)
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    ll s, n;
    cin >> s >> n;
    vector<ll> dp(s+1, 0);
    ffor(i,1,n){
        ll v, w, k;
        cin >> v >> w >> k;
        vector<ll> prv = dp;
        ffor(r,0,w-1){
            if(r > s) break;
            ll mmax = (s - r) / w;
            vector<ll> q_idx(mmax+5), q_val(mmax+5);
            ll head = 0, tail = 0;
            ffor(m,0,mmax){
                ll j = r + m*w;
                ll cand = prv[j] - m*v;
                while(head < tail && q_val[tail-1] <= cand) tail--;
                q_idx[tail] = m;
                q_val[tail] = cand;
                tail++;
                while(head < tail && q_idx[head] < m - k) head++;
                ll best = q_val[head] + m*v;
                if(best > dp[j]) dp[j] = best;
            }
        }
    }
    ll ans = 0;
    ffor(i,0,s) ans = max(ans, dp[i]);
    cout << ans;
    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...