Advertisement
Fshl0

Untitled

Mar 8th, 2022
895
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.13 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define F first
  3. #define S second
  4. #define pb push_back
  5.  
  6. using namespace std;
  7. typedef long long ll;
  8.  
  9. #include <ext/pb_ds/assoc_container.hpp>
  10. #include <ext/pb_ds/tree_policy.hpp>
  11. using namespace __gnu_pbds;
  12.  
  13. #define ordered_set tree<pair<ll,int>, null_type,less<pair<ll,int>>, rb_tree_tag,tree_order_statistics_node_update>
  14.  
  15. const ll INF = 1e16;
  16. const int mxN = 1e5 + 9;
  17. const int mxK = 1e2 + 9;
  18. const int MOD = 1000000007;
  19.  
  20. vector <pair <pair <int, int>, int> > options[mxN];
  21. ll dp[mxN][mxK], A[mxN];
  22.  
  23. void solve () {
  24.     int n, m;
  25.     cin >> n >> m;
  26.    
  27.     for (int i = 1; i <= n; i++)
  28.         cin >> A[i];
  29.    
  30.     for (int i = 1; i <= m; i++) {
  31.         int e, t, p;
  32.         cin >> e >> t >> p;
  33.        
  34.         options[e].push_back ({{t, p}, i});
  35.     }
  36.    
  37.     vector <int> res;
  38.    
  39.     int lastDone = 0;
  40.     for (int i = 1; i <= n; i++) {
  41.         int len = options[i].size();
  42.        
  43.         for (int j = 0; j <= len; j++)
  44.             for (int k = 0; k <= 200; k++)
  45.                 dp[j][k] = INF;
  46.            
  47.         dp[0][0] = 0;
  48.         int j = 1;
  49.        
  50.         for (auto [x, y]: options[i]) {
  51.             int t = x.F, p = x.S;
  52.             for (int k = 0; k <= 200; k++) {
  53.                 dp[j][k] = dp[j - 1][k];
  54.                 if (k >= p)
  55.                     dp[j][k] = min (dp[j][k], dp[j - 1][k - p] + t);
  56.             }
  57.             j++;
  58.         }
  59.        
  60.         ll toCompare = INF;
  61.         for (int k = 100; k <= 200; k++)
  62.             toCompare = min (toCompare, dp[len][k]);
  63.        
  64.         //cout << toCompare << "\n";
  65.         if (toCompare + lastDone > A[i]) {
  66.             puts ("-1");
  67.             return;
  68.         } else {
  69.             int x, y;
  70.             for (int j = 100; j <= 200; j++)
  71.                 if (toCompare == dp[len][j])
  72.                     x = len, y = j;
  73.            
  74.             pair <int, int> curState = {x, y};
  75.             while (curState.F > 0) {
  76.                 int j = curState.F, k = curState.S;
  77.            
  78.                 if (dp[j][k] == dp[j - 1][k]) {
  79.                     curState = {j - 1, k};
  80.                 } else {
  81.                     res.pb (options[i][j - 1].S);
  82.                     curState = {j - 1, k - options[i][j - 1].F.S};
  83.                 }
  84.             }
  85.            
  86.             lastDone += toCompare;
  87.         }
  88.     }
  89.    
  90.     cout << res.size() << "\n";
  91.     for (auto u: res)
  92.         cout << u << ' ';
  93.     puts ("");
  94.        
  95.     for (int i = 1; i <= n; i++)
  96.         options[i].clear();
  97.        
  98.     return;
  99. }
  100.  
  101. int main () {
  102.     int t = 1;
  103.     cin >> t;
  104.        
  105.     //preCalc ();
  106.     while (t--) {
  107.         solve ();
  108.     }
  109.        
  110.     return 0;
  111. }
  112.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement