Submission #566166

# Submission time Handle Problem Language Result Execution time Memory
566166 2022-05-21T23:27:16 Z TheDeliverator Knapsack (NOI18_knapsack) C++17
100 / 100
159 ms 33188 KB
#include <map>
#include <cstring>
#include <iostream>
#include <vector>
#include <cmath>
#include <string>
#include <algorithm>
#include <cstring>
#include <unordered_map>
#include <fstream>
#include <set>
#include <queue>
using namespace std;

#define ll long long
#define pb push_back


/*
 *
 *  Segment Tree implementation
 *  Current implementation: Range Minimum Query
 *
 */
template <class T> struct SegTree {


  /*
   *    TODO: Now the building of the tree is done by updating values which is done in O(NlogN)
   *    TODO: Better understand the maths behind the algorithm
   *    Implement a build function which builds the segment tree from a fixed-size array such that it runs in linear time
   * */

  int init_val = 1e9 + 1; // max value as we want the minimum (used for min segment tree)
  int tree_size;
  vector <T> segment;

  void init(int _n) {
    tree_size = _n;
    segment.assign(2 * tree_size + 2, init_val); // +2 to ensure safe space for [0,n]
  }

  T combine(T a, T b) {
    return a + b; // sum queries
  }

  void pull(int p) {
    segment[p] = combine(segment[2 * p], segment[2 * p + 1]);
  }

  void update(int p, T val) {
    // sets val at position p
    segment[p += tree_size] = val;
    for (p /= 2; p != 0; p /= 2) {
      pull(p);
    }
  }

  T query(int l, int r) {
    // sum on interval [l, r]

    T ra, rb;
    ra = rb = 0;
    for (l += tree_size, r += tree_size + 1; l < r; l /= 2, r /= 2) {
      if (l & 1) ra = combine(ra, segment[l++]);
      if (r & 1) rb = combine(segment[--r], rb);
    }

    return combine(ra, rb);
  }
};

const int MOD = 1e9+7;
const int NMAX = 5000005;
//ll dp[2005][2005];

class Solver {

  public:

    Solver(){}

    void static solve(int test) {

    }

    void static solve() {

      //ifstream fin("feast.in");
      //ofstream fout("feast.out");
      //

      ll s, n;
      cin >> s >> n;
      map<int, vector<pair<int, int>>> mp;
      for (int i = 0; i < n; i++) {

        int v, w, k;
        cin >> v >> w >> k;
        mp[w].pb({v, k});
      }

      vector <vector <ll>> dp(mp.size() + 1, vector<ll>(s+1, -1e9));


      dp[0][0] = 0;
      int weight_types = 1;
      for (auto& [w, items] : mp) {
        sort(items.begin(), items.end(), std::greater<pair<int, int>>());

        for (int i = 0; i <= s; i++) {

          dp[weight_types][i] = dp[weight_types - 1][i];
          int curr = 0, type = 0, used = 0;
          ll profit = 0;
          while ((used + 1) * w <= i && type < items.size()) {
            profit += items[type].first;
            used++;
            if (dp[weight_types - 1][i - (used) * w] != -1e9) {
              dp[weight_types][i] = max(dp[weight_types][i], dp[weight_types - 1][i - (used) * w] + profit);
            }

            curr++;
            if (curr == items[type].second) {
              curr = 0;
              ++type;
            }
          }
        }

        weight_types++;
      }


      ll ans = 0;
      for (int i = 0; i <= s; i++) {
        ans = max(ans, dp[mp.size()][i]);
      }
      cout << ans << "\n";
    }

    void static tsolve() {
      int tests;
      cin >> tests;
      for (int i = 0; i < tests; i++) {
        solve(i);
      }
    }
};


int main() {


    Solver::solve();
    return 0;
}

Compilation message

knapsack.cpp: In static member function 'static void Solver::solve()':
knapsack.cpp:116:46: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  116 |           while ((used + 1) * w <= i && type < items.size()) {
      |                                         ~~~~~^~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 1 ms 360 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 340 KB Output is correct
6 Correct 2 ms 1748 KB Output is correct
7 Correct 2 ms 1748 KB Output is correct
8 Correct 2 ms 1748 KB Output is correct
9 Correct 2 ms 1748 KB Output is correct
10 Correct 2 ms 1748 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 1 ms 360 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 340 KB Output is correct
6 Correct 2 ms 1748 KB Output is correct
7 Correct 2 ms 1748 KB Output is correct
8 Correct 2 ms 1748 KB Output is correct
9 Correct 2 ms 1748 KB Output is correct
10 Correct 2 ms 1748 KB Output is correct
11 Correct 0 ms 212 KB Output is correct
12 Correct 3 ms 340 KB Output is correct
13 Correct 1 ms 340 KB Output is correct
14 Correct 0 ms 340 KB Output is correct
15 Correct 0 ms 340 KB Output is correct
16 Correct 2 ms 1748 KB Output is correct
17 Correct 2 ms 1748 KB Output is correct
18 Correct 2 ms 1748 KB Output is correct
19 Correct 2 ms 1748 KB Output is correct
20 Correct 2 ms 1868 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 1 ms 360 KB Output is correct
7 Correct 1 ms 340 KB Output is correct
8 Correct 1 ms 340 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Correct 2 ms 1748 KB Output is correct
11 Correct 2 ms 1748 KB Output is correct
12 Correct 2 ms 1748 KB Output is correct
13 Correct 2 ms 1748 KB Output is correct
14 Correct 2 ms 1748 KB Output is correct
15 Correct 0 ms 212 KB Output is correct
16 Correct 3 ms 340 KB Output is correct
17 Correct 1 ms 340 KB Output is correct
18 Correct 0 ms 340 KB Output is correct
19 Correct 0 ms 340 KB Output is correct
20 Correct 2 ms 1748 KB Output is correct
21 Correct 2 ms 1748 KB Output is correct
22 Correct 2 ms 1748 KB Output is correct
23 Correct 2 ms 1748 KB Output is correct
24 Correct 2 ms 1868 KB Output is correct
25 Correct 0 ms 212 KB Output is correct
26 Correct 4 ms 340 KB Output is correct
27 Correct 1 ms 340 KB Output is correct
28 Correct 1 ms 340 KB Output is correct
29 Correct 1 ms 340 KB Output is correct
30 Correct 3 ms 1840 KB Output is correct
31 Correct 2 ms 1748 KB Output is correct
32 Correct 2 ms 1740 KB Output is correct
33 Correct 2 ms 1748 KB Output is correct
34 Correct 2 ms 1748 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 1 ms 360 KB Output is correct
7 Correct 1 ms 340 KB Output is correct
8 Correct 1 ms 340 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Correct 2 ms 1748 KB Output is correct
11 Correct 2 ms 1748 KB Output is correct
12 Correct 2 ms 1748 KB Output is correct
13 Correct 2 ms 1748 KB Output is correct
14 Correct 2 ms 1748 KB Output is correct
15 Correct 0 ms 212 KB Output is correct
16 Correct 3 ms 340 KB Output is correct
17 Correct 1 ms 340 KB Output is correct
18 Correct 0 ms 340 KB Output is correct
19 Correct 0 ms 340 KB Output is correct
20 Correct 2 ms 1748 KB Output is correct
21 Correct 2 ms 1748 KB Output is correct
22 Correct 2 ms 1748 KB Output is correct
23 Correct 2 ms 1748 KB Output is correct
24 Correct 2 ms 1868 KB Output is correct
25 Correct 0 ms 212 KB Output is correct
26 Correct 4 ms 340 KB Output is correct
27 Correct 1 ms 340 KB Output is correct
28 Correct 1 ms 340 KB Output is correct
29 Correct 1 ms 340 KB Output is correct
30 Correct 3 ms 1840 KB Output is correct
31 Correct 2 ms 1748 KB Output is correct
32 Correct 2 ms 1740 KB Output is correct
33 Correct 2 ms 1748 KB Output is correct
34 Correct 2 ms 1748 KB Output is correct
35 Correct 70 ms 1368 KB Output is correct
36 Correct 79 ms 1456 KB Output is correct
37 Correct 77 ms 1328 KB Output is correct
38 Correct 81 ms 1348 KB Output is correct
39 Correct 95 ms 1332 KB Output is correct
40 Correct 159 ms 33144 KB Output is correct
41 Correct 124 ms 33188 KB Output is correct
42 Correct 144 ms 33096 KB Output is correct
43 Correct 140 ms 33088 KB Output is correct
44 Correct 141 ms 33008 KB Output is correct
45 Correct 104 ms 4732 KB Output is correct
46 Correct 99 ms 1416 KB Output is correct
47 Correct 110 ms 7884 KB Output is correct
48 Correct 125 ms 17236 KB Output is correct
49 Correct 92 ms 2028 KB Output is correct
50 Correct 131 ms 2000 KB Output is correct