fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. const ll INF = (ll)4e18;
  5.  
  6. int main(){
  7. ios::sync_with_stdio(false);
  8. cin.tie(nullptr);
  9.  
  10. int n, m;
  11. cin >> n >> m;
  12. int s[m], p[m], w[m];
  13. for(int i = 0; i < m; i++){
  14. cin >> s[i] >> p[i] >> w[i];
  15. }
  16. vector<ll> dp(n+1, INF), ndp(n+1);
  17. dp[0] = 0;
  18.  
  19. for(int i = 0; i < m; i++){
  20. ndp = dp;
  21. deque<int> deq;
  22. auto &pi = p[i];
  23. auto &wi = w[i];
  24. int si = s[i];
  25. for(int j = 0; j <= n; j++){
  26. if(j-1 >= 0){
  27. int t = j-1;
  28. ll val = dp[t] - (ll)pi * t;
  29. while(!deq.empty() && (dp[deq.back()] - (ll)pi * deq.back()) >= val)
  30. deq.pop_back();
  31. deq.push_back(t);
  32. }
  33. while(!deq.empty() && deq.front() < j - si)
  34. deq.pop_front();
  35. if(!deq.empty()){
  36. ll best = dp[deq.front()] - (ll)pi * deq.front();
  37. ndp[j] = min(ndp[j], best + wi + (ll)pi * j);
  38. }
  39. }
  40. dp.swap(ndp);
  41. }
  42.  
  43. cout << dp[n] << "\n";
  44. return 0;
  45. }
  46.  
Success #stdin #stdout 0.01s 5320KB
stdin
20 4
5 5 6
10 4 12
15 6 9
20 7 0
stdout
118