#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |