Advertisement
Dang_Quan_10_Tin

LUCKUST

Mar 21st, 2023
607
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.95 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define pb push_back
  3. using namespace std;
  4. const int N = 1e3+5;
  5. int n, m, t;
  6. int r[N], l[N], v[N], w[N];
  7. int dp[N][N], res[N];
  8. void dac(int lef, int rig, vector<int>& q) {
  9.     if(lef > rig)return;
  10.     if(lef == rig){
  11.         for(int i: q){
  12.             res[i] = (w[lef] <= m ? v[lef] : 0);
  13.         }
  14.         return;
  15.     }
  16.     int mid = (lef+rig)/2;
  17.     for(int i = 0; i <= m; i ++){
  18.         if(i >= w[mid])dp[mid][i] = v[mid];
  19.         else dp[mid][i] = 0;
  20.         if(i >= w[mid+1])dp[mid+1][i] = v[mid+1];
  21.         else dp[mid+1][i] = 0;
  22.     }
  23.     for(int i = mid-1; i >= lef; i --){
  24.         for(int j = m; j >= 0; j --){
  25.             dp[i][j] = dp[i+1][j];
  26.             if(j >= w[i])dp[i][j] = max(dp[i][j], dp[i+1][j-w[i]]+v[i]);
  27.         }
  28.     }
  29.     for(int i = mid+2; i <= rig; i ++){
  30.         for(int j = m; j >= 0; j --){
  31.             dp[i][j] = dp[i-1][j];
  32.             if(j >= w[i])dp[i][j] = max(dp[i][j], dp[i-1][j-w[i]]+v[i]);
  33.         }
  34.     }
  35.     vector<int> vl, vr;
  36.     while(!q.empty()){
  37.         int i = q.back();
  38.         q.pop_back();
  39.         if(l[i] <= mid && mid <= r[i]){
  40.             if(r[i] == mid)res[i] = dp[l[i]][m];
  41.             else{
  42.                 for(int j = 0; j <= m; j ++){
  43.                     res[i] = max(res[i], dp[l[i]][j]+dp[r[i]][m-j]);
  44.                 }
  45.             }
  46.         }
  47.         else if(r[i] <= mid)vl.pb(i);
  48.         else vr.pb(i);
  49.     }
  50.     dac(lef, mid, vl);
  51.     dac(mid+1, rig, vr);
  52. }
  53. int main() {
  54.      #define task "test"
  55.     if(fopen(task".inp", "r"))
  56.     {
  57.         freopen(task".inp", "r", stdin);
  58.         freopen(task".out", "w", stdout);
  59.     }
  60.     ios_base::sync_with_stdio(0);
  61.     cin.tie(0);
  62.     cin >> n >> m;
  63.     for(int i = 1; i <= n; i ++)cin >> w[i] >> v[i];
  64.     cin >> t;
  65.     vector<int> q;
  66.     for(int i = 1; i <= t; i ++){
  67.         cin >> l[i] >> r[i];
  68.         q.pb(i);
  69.     }
  70.     dac(1, n, q);
  71.     for(int i = 1; i <= t; i ++)cout << res[i] << '\n';
  72. }
  73.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement