#include <iostream> #include <vector> #include <array> #include <cassert> #include <cstring> using ll = long long; constexpr int max_n = 7e3 + 10; constexpr int max_m = 7e3 + 10; constexpr int max_k = 7e3 + 10; ll cost1[max_k][max_m]; int input_k[max_n]; int input_m[max_n]; int input_c[max_n]; std::vector<int> index_of_color[max_k]; ll sat_add(ll a, ll b) { if (a == -1ll || b == -1ll) return -1ll; else return a + b; } ll sat_min(ll a, ll b) { if (a == -1ll) return b; if (b == -1ll) return a; return std::min(a, b); } void self_sat_min(ll& a, ll b) { a = sat_min(std::move(a), std::move(b)); } ll fmod(ll m1, ll m2) { if (m1 >= m2) return m1 - m2; else return m1; } std::array<ll, max_n> pot1; std::array<ll, max_n> pot2; int main() { std::ios_base::sync_with_stdio(0); std::cin.tie(0); int n, k, m; std::cin >> n >> k >> m; assert(n >= 1); assert(k >= 1); assert(m >= 1); for (int i = 0; i < n; ++i) { std::cin >> input_k[i] >> input_m[i] >> input_c[i]; index_of_color[input_k[i]].push_back(i); } for (int i = 0; i <= k; ++i) for (int j = 0; j < m; ++j) cost1[i][j] = -1; cost1[0][0] = 0; for(int kolor = 1; kolor <= k; ++kolor) for (int ind : index_of_color[kolor]) for (int mods = 0; mods < m; ++mods) self_sat_min(cost1[kolor][(mods + input_m[ind]) % m], sat_add(cost1[kolor - 1][mods], input_c[ind])); memcpy(pot2.data(), &cost1[k][0], sizeof(ll) * m); pot2[0] = 0; int count = 0; do { ++count; pot1 = pot2; for (int i = 0; i < m; ++i) for (int j = 0; j < m; ++j) self_sat_min(pot2[(i + j) % m], sat_add(pot1[i], pot1[j])); } while (pot1 != pot2); for (int i = 0; i < m; ++i) std::cout << pot1[i] << '\n'; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | #include <iostream> #include <vector> #include <array> #include <cassert> #include <cstring> using ll = long long; constexpr int max_n = 7e3 + 10; constexpr int max_m = 7e3 + 10; constexpr int max_k = 7e3 + 10; ll cost1[max_k][max_m]; int input_k[max_n]; int input_m[max_n]; int input_c[max_n]; std::vector<int> index_of_color[max_k]; ll sat_add(ll a, ll b) { if (a == -1ll || b == -1ll) return -1ll; else return a + b; } ll sat_min(ll a, ll b) { if (a == -1ll) return b; if (b == -1ll) return a; return std::min(a, b); } void self_sat_min(ll& a, ll b) { a = sat_min(std::move(a), std::move(b)); } ll fmod(ll m1, ll m2) { if (m1 >= m2) return m1 - m2; else return m1; } std::array<ll, max_n> pot1; std::array<ll, max_n> pot2; int main() { std::ios_base::sync_with_stdio(0); std::cin.tie(0); int n, k, m; std::cin >> n >> k >> m; assert(n >= 1); assert(k >= 1); assert(m >= 1); for (int i = 0; i < n; ++i) { std::cin >> input_k[i] >> input_m[i] >> input_c[i]; index_of_color[input_k[i]].push_back(i); } for (int i = 0; i <= k; ++i) for (int j = 0; j < m; ++j) cost1[i][j] = -1; cost1[0][0] = 0; for(int kolor = 1; kolor <= k; ++kolor) for (int ind : index_of_color[kolor]) for (int mods = 0; mods < m; ++mods) self_sat_min(cost1[kolor][(mods + input_m[ind]) % m], sat_add(cost1[kolor - 1][mods], input_c[ind])); memcpy(pot2.data(), &cost1[k][0], sizeof(ll) * m); pot2[0] = 0; int count = 0; do { ++count; pot1 = pot2; for (int i = 0; i < m; ++i) for (int j = 0; j < m; ++j) self_sat_min(pot2[(i + j) % m], sat_add(pot1[i], pot1[j])); } while (pot1 != pot2); for (int i = 0; i < m; ++i) std::cout << pot1[i] << '\n'; } |