제출 #1282145

#제출 시각아이디문제언어결과실행 시간메모리
1282145Faisal_SaqibKnapsack (NOI18_knapsack)C++20
73 / 100
1098 ms76016 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define int ll
const int N=1e5+100;
const int S=2001;
const ll inf=1e18;
int w[N],v[N],k[N];
ll dp[N],ad[N];
ll vec[S][S];
deque<int> cur[N];
int32_t main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int s,n;
    cin>>s>>n;
    for(int i=0;i<n;i++)
    {
        cin>>v[i]>>w[i]>>k[i];
        k[i]=min(2000ll,k[i]);
    }
    // dp[i][s] = max value 
    // dp[i][s]  = dp[i-1][s] take no elements
    // dp[i][s] = dp[i-1][s-w[i]]+v[i] 1 ele
    // dp[i][s] = max(dp[i-1][s-k*w[i]]+v[i]*k)
    for(int i=0;i<n;i++)
    {
        // dp[x] = max(dp[x-w[i]])
        for(int idp=0;idp<=s;idp++)
        {
            if(idp<w[i])
            {
                // [0,s] 
                // how many with mod w[i] =idp
                // idp+k*w[i] <=s
                // k <= (s-idp)/w[i]
                // int tlp=(s-idp)/w[i]; // tlp>=0
                // vec[idp].clear();
                // vec[idp].resize(tlp+1);
                cur[idp].clear();
                // cur[idp].reserve(k[i]);
                ad[idp]=0;
            }
            int x=idp%w[i],j=idp/w[i];
            vec[x][j]=dp[idp];
            // ll ad=0;
            // for(int j=vec[x].size()-1;j<vec[x].size();j++)
            {
                ad[x]+=v[i];
                // cur[0]>= cur[1]>=cur[2]
                while(cur[x].front()<j-k[i])
                    cur[x].pop_front();
                vec[x][j]-=ad[x];
                while(cur[x].size()>0 and vec[x][cur[x].back()]<vec[x][j])
                    cur[x].pop_back();
                cur[x].push_back(j);
                    // cur[x].insert(vec[x][j]-ad[x]);
                if(cur[x].size()>0)
                    dp[idp]=vec[x][cur[x].front()]+ad[x];
            }
        }
    }
    ll mx=0;
    for(int i=0;i<=s;i++)mx=max(mx,dp[i]);
    cout<<mx<<endl;
}
#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...