제출 #625522

#제출 시각아이디문제언어결과실행 시간메모리
625522HuyKnapsack (NOI18_knapsack)C++17
73 / 100
1093 ms4144 KiB
/// punch then pray
#include<bits/stdc++.h>
//#define int long long
#define pii pair<int,int>
#define fi first
#define se second
/*#pragma GCC target ("avx2")
#pragma GCC optimization ("O3")
#pragma GCC optimization ("unroll-loops")
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")*/
using namespace std;
using ll = long long;
using ull = unsigned long long;
using ldb = long double;
const int N = (int)1e5 ;
const int maxN = (int)5e5 + 1;
const int mod = 1e9 + 7;
//const int mod = 998244353;
const ll infty = 1e18 + 7;
const int base = (int)4e5;
const int block_size = 710;

void InputFile()
{
    //freopen("feast.in","r",stdin);
    //freopen("feast.out","w",stdout);
    //freopen("test.inp","r",stdin);
    //freopen("test.out","w",stdout);
}

void FastInput()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
}

int S,n;
int val[maxN],wei[maxN],cop[maxN];
int f[2001];
int g[2001];
int dp[2][2001];
deque<int> dq[2001];

void Read()
{
    cin >> S >> n;
    for(int i = 1; i <= n; i++)
    {
        cin >> val[i] >> wei[i] >> cop[i];
        cop[i] = min(cop[i],S / wei[i]);
    }
    /// i == 0;
    int i = 0;
    for(int rem = 0; rem < wei[i+1]; rem++)
    {
        while(!dq[rem].empty())
            dq[rem].pop_back();
    }
    for(int j = 0; j <= S; j++)
    {
        f[j] = dp[0][j] - j / wei[i+1] * val[i+1] ;
        int rem = j % wei[i+1];
        while(!dq[rem].empty() && f[dq[rem].back()] <= f[j])
        {
            dq[rem].pop_back();
        }
        dq[rem].push_back(j);
        while(dq[rem].front() + cop[i+1] * wei[i+1] <= j)
        {
            dq[rem].pop_front();
        }
        g[j] = f[dq[rem].front()];
    }

    for(int i = 1; i <= n; i++)
    {
        int cur = i & 1;
        int pre = cur ^ 1;
        for(int j = 0; j <= S; j++)
        {
            dp[cur][j] = dp[pre][j];
            if(j >= wei[i])
            {
                dp[cur][j] = max(dp[cur][j],g[j-wei[i]] + j / wei[i] * val[i]);
            }
        }

        if(i < n)
        {
            for(int rem = 0; rem < wei[i+1]; rem++)
            {
                while(!dq[rem].empty())
                    dq[rem].pop_back();
            }

            for(int j = 0; j <= S; j++)
            {
                f[j] = dp[cur][j] - j / wei[i+1] * val[i+1] ;
                int rem = j % wei[i+1];
                while(!dq[rem].empty() && f[dq[rem].back()] <= f[j])
                {
                    dq[rem].pop_back();
                }
                dq[rem].push_back(j);
                while(dq[rem].front() + cop[i+1] * wei[i+1] <= j)
                {
                    dq[rem].pop_front();
                }
                g[j] = f[dq[rem].front()];
            }
        }
    }
    cout << dp[n&1][S];
}

void Solve()
{

}


int32_t main()
{
    FastInput();
    //InputFile();
    //int sub_type;
    //cin >> sub_type;
    //Sieve()
    int test;
    //cin >> test;
    test = 1;
    while(test--)
    {
        Read();
        Solve();
        //Debug();
    }
}
////
/////
//////
#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...