#include <bits/stdc++.h> using ll = unsigned long long; int n, k, m; int K[7001], M[7001]; ll C[7001]; ll INF = std::numeric_limits<ll>::max() / 2; std::vector<int> color_list[7001]; void read(){ std::cin >> n >> k >> m; for(int i = 0; i < n; i++) { std::cin >> K[i] >> M[i] >> C[i]; color_list[K[i]].push_back(i); } } void solve() { std::vector<ll> old_single(m, INF); old_single[0] = 0; for(int color = 1; color <= k; color++) { std::vector<ll> new_single(m, INF); for(int r = 0; r < m; r++) { if(old_single[r] == INF) continue; for(int candy : color_list[color]) { new_single[(r + M[candy]) % m] = std::min(new_single[(r + M[candy]) % m], old_single[r] + C[candy]); } } old_single = new_single; } /* std::cerr << "old_single:\t"; for(int r = 0; r < m; r++) { std::cerr << old_single[r] << " "; } std::cerr << "\n"; */ std::vector<ll> multiple0(m), multiple1(m); multiple0 = old_single; multiple0[0] = 0; for(int iters = 0; ; iters++) { multiple1 = std::vector<ll>(m, INF); /* for(int x = 0; x < m; x++) { for(int r = 0; r < m; r++) { multiple1[r] = std::min(multiple1[r], multiple0[x] + multiple0[(m + r - x) % m]); } } */ multiple0.insert(multiple0.end(), multiple0.begin(), multiple0.end()); multiple1 = std::vector<ll>(m, INF); for(int x = 0; x < m; x++) { for(int r = 0; r < m; r++) { multiple1[r] = std::min(multiple1[r], multiple0[x] + multiple0[m + r - x]); } } multiple0.resize(m); if(multiple0 == multiple1) { //std::cerr << "iters = " << iters << "\n"; break; } else { multiple0 = multiple1; } } for(int r = 0; r < m; r++) { if(multiple0[r] == INF) std::cout << "-1\n"; else std::cout << multiple0[r] << "\n"; } } int main() { read(); solve(); }
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 | #include <bits/stdc++.h> using ll = unsigned long long; int n, k, m; int K[7001], M[7001]; ll C[7001]; ll INF = std::numeric_limits<ll>::max() / 2; std::vector<int> color_list[7001]; void read(){ std::cin >> n >> k >> m; for(int i = 0; i < n; i++) { std::cin >> K[i] >> M[i] >> C[i]; color_list[K[i]].push_back(i); } } void solve() { std::vector<ll> old_single(m, INF); old_single[0] = 0; for(int color = 1; color <= k; color++) { std::vector<ll> new_single(m, INF); for(int r = 0; r < m; r++) { if(old_single[r] == INF) continue; for(int candy : color_list[color]) { new_single[(r + M[candy]) % m] = std::min(new_single[(r + M[candy]) % m], old_single[r] + C[candy]); } } old_single = new_single; } /* std::cerr << "old_single:\t"; for(int r = 0; r < m; r++) { std::cerr << old_single[r] << " "; } std::cerr << "\n"; */ std::vector<ll> multiple0(m), multiple1(m); multiple0 = old_single; multiple0[0] = 0; for(int iters = 0; ; iters++) { multiple1 = std::vector<ll>(m, INF); /* for(int x = 0; x < m; x++) { for(int r = 0; r < m; r++) { multiple1[r] = std::min(multiple1[r], multiple0[x] + multiple0[(m + r - x) % m]); } } */ multiple0.insert(multiple0.end(), multiple0.begin(), multiple0.end()); multiple1 = std::vector<ll>(m, INF); for(int x = 0; x < m; x++) { for(int r = 0; r < m; r++) { multiple1[r] = std::min(multiple1[r], multiple0[x] + multiple0[m + r - x]); } } multiple0.resize(m); if(multiple0 == multiple1) { //std::cerr << "iters = " << iters << "\n"; break; } else { multiple0 = multiple1; } } for(int r = 0; r < m; r++) { if(multiple0[r] == INF) std::cout << "-1\n"; else std::cout << multiple0[r] << "\n"; } } int main() { read(); solve(); } |