Submission #1273043

#TimeUsernameProblemLanguageResultExecution timeMemory
1273043zhaoxwKnapsack (NOI18_knapsack)C++20
100 / 100
900 ms2976 KiB
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAX_N = 100005;
int v[MAX_N],w[MAX_N],k[MAX_N],a[MAX_N],b[MAX_N],c[MAX_N],dp[2005],n,s,ans;
int head,tail,qnum[MAX_N],qidx[MAX_N];
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> s >> n;
    for(int i = 1;i <= n;i++)
        cin >> v[i] >> w[i] >> k[i];
    for(int i = 1;i <= n;i++)
        for(int j = 0;j < w[i];j++)
        {
            int cnt = 0,num = j,maxn;
            while(num <= s)
            {
                a[cnt] = c[cnt] = num;
                cnt++;
                num += w[i];
            }
            int len = cnt-1;
            for(int l = 0;l <= len;l++)
            {
                a[l] = (len-l)*v[i]+dp[c[l]];
                b[l] = len-l;
            }
            int it = len-k[i];
            head = 0,tail = -1;
            int o = max(0LL,len-k[i]);
            for(int l = len;l >= o;l--)
            {
                while(head <= tail && qnum[tail] < a[l])
                    tail--;
                //q.push_back({a[l],l});
                tail++;
                qnum[tail] = a[l];
                qidx[tail] = l;
                //q.push_back(a[l]);
            }
            for(int l = len;l >= 0;l--)
            {
                maxn = 0;
                if(head <= tail) maxn = qnum[head];
                dp[c[l]] = maxn-b[l]*v[i];
                it--;
                if(it >= 0)
                {
                    while(head <= tail && qnum[tail] < a[it])
                        tail--;
                    tail++;
                    qnum[tail] = a[it];
                    qidx[tail] = it;
                    //q.push_back({a[it],it});
                }
                while(head <= tail && qidx[head] > l-1) head++;
            }
        }
    cout << dp[s] << '\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...