Submission #1282153

#TimeUsernameProblemLanguageResultExecution timeMemory
1282153Faisal_SaqibKnapsack (NOI18_knapsack)C++17
73 / 100
1095 ms17680 KiB
#include <iostream>
using namespace std;
#define ll long long
// #define int ll
const int N=1e5+100;
const int S=2005;
const ll inf=1e18;
int w[N],v[N],k[N];
ll dp[S],ad[S];
int l[S],r[S];
ll vec[S][S];
int cur[S][S];
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(2000,k[i]);
    }
    for(int i=0;i<n;i++)
    {
        for(int idp=0;idp<=s;idp++)
        {
            if(idp<w[i])
            {
                l[idp]=r[idp]=0;
                ad[idp]=0;
            }
            int x=idp%w[i],j=idp/w[i];
            vec[x][j]=dp[idp];
            {
                ad[x]+=v[i];
                while(l[x]<r[x] and cur[x][l[x]]<j-k[i])
                    l[x]++;
                vec[x][j]-=ad[x];
                while(l[x]<r[x] and vec[x][cur[x][r[x]-1]]<=vec[x][j])
                    r[x]--;
                cur[x][r[x]]=j;
                r[x]++;
                if(l[x]<r[x])
                    dp[idp]=vec[x][cur[x][l[x]]]+ad[x];
            }
        }
    }
    ll mx=0;
    for(int i=0;i<=s;i++)mx=max(mx,dp[i]);
    cout<<mx;
}
#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...