#include<iostream> #include<vector> #include<algorithm> #include<set> int main() { std::ios_base::sync_with_stdio(0); std::cin.tie(0); int n, k, m, x; std::cin >> n >> k >> m; std::vector<std::vector<std::pair<int, long long>>> w(k); { std::pair<int, long long> h; for (int i = 0; i < n; i++) { std::cin >> x >> h.first >> h.second; x--; w[x].push_back(h); } } std::vector<std::vector<long long>> h; h.resize(k + 1, std::vector<long long>(m)); h[0][0] = 1; for (int i = 0; i < k; i++) { for (int j = 0; j < w[i].size(); j++) { for (int ii = 0; ii < m; ii++) { if (h[i][ii] != 0) { if (h[i + 1][(ii + w[i][j].first) % m] != 0) h[i + 1][(ii + w[i][j].first) % m] = std::min(h[i][ii] + w[i][j].second, h[i + 1][(ii + w[i][j].first) % m]); else h[i + 1][(ii + w[i][j].first) % m] = h[i][ii] + w[i][j].second; } } } } h[0][0] = 0; std::vector<std::pair<long long, int>> res; std::set<std::pair<long long, int>> s; std::set<std::pair<long long, int>>::iterator itr; s.insert({ 0, 0 }); h[h.size() - 1][0] = 0; for (int i = 1; i < m; i++) { h[h.size() - 1][i]--; if (h[h.size() - 1][i] != -1) { res.push_back({ h[h.size() - 1][i], i }); } else h[h.size() - 1][i] = INT64_MAX; } std::sort(res.begin(), res.end()); for (int j = 0; j < m; j++) { s.insert({ h[h.size() - 1][j], j }); } for (int i = 0; i < res.size(); i++) { for (itr = s.begin(); itr != s.end(); itr++) { if ((*itr).first == INT64_MAX) { break; } if (h[h.size() - 1][((*itr).second + res[i].second) % m] > (*itr).first + res[i].first) { s.erase(s.find({ h[h.size() - 1][((*itr).second + res[i].second) % m], ((*itr).second + res[i].second) % m })); s.insert({ (*itr).first + res[i].first,((*itr).second + res[i].second) % m }); h[h.size() - 1][((*itr).second + res[i].second) % m] = (*itr).first + res[i].first; } } } for (int i = 0; i < m; i++) { if (h[h.size() - 1][i] == INT64_MAX) std::cout << "-1\n"; else { std::cout << h[h.size() - 1][i] << "\n"; } } return 0; }
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 | #include<iostream> #include<vector> #include<algorithm> #include<set> int main() { std::ios_base::sync_with_stdio(0); std::cin.tie(0); int n, k, m, x; std::cin >> n >> k >> m; std::vector<std::vector<std::pair<int, long long>>> w(k); { std::pair<int, long long> h; for (int i = 0; i < n; i++) { std::cin >> x >> h.first >> h.second; x--; w[x].push_back(h); } } std::vector<std::vector<long long>> h; h.resize(k + 1, std::vector<long long>(m)); h[0][0] = 1; for (int i = 0; i < k; i++) { for (int j = 0; j < w[i].size(); j++) { for (int ii = 0; ii < m; ii++) { if (h[i][ii] != 0) { if (h[i + 1][(ii + w[i][j].first) % m] != 0) h[i + 1][(ii + w[i][j].first) % m] = std::min(h[i][ii] + w[i][j].second, h[i + 1][(ii + w[i][j].first) % m]); else h[i + 1][(ii + w[i][j].first) % m] = h[i][ii] + w[i][j].second; } } } } h[0][0] = 0; std::vector<std::pair<long long, int>> res; std::set<std::pair<long long, int>> s; std::set<std::pair<long long, int>>::iterator itr; s.insert({ 0, 0 }); h[h.size() - 1][0] = 0; for (int i = 1; i < m; i++) { h[h.size() - 1][i]--; if (h[h.size() - 1][i] != -1) { res.push_back({ h[h.size() - 1][i], i }); } else h[h.size() - 1][i] = INT64_MAX; } std::sort(res.begin(), res.end()); for (int j = 0; j < m; j++) { s.insert({ h[h.size() - 1][j], j }); } for (int i = 0; i < res.size(); i++) { for (itr = s.begin(); itr != s.end(); itr++) { if ((*itr).first == INT64_MAX) { break; } if (h[h.size() - 1][((*itr).second + res[i].second) % m] > (*itr).first + res[i].first) { s.erase(s.find({ h[h.size() - 1][((*itr).second + res[i].second) % m], ((*itr).second + res[i].second) % m })); s.insert({ (*itr).first + res[i].first,((*itr).second + res[i].second) % m }); h[h.size() - 1][((*itr).second + res[i].second) % m] = (*itr).first + res[i].first; } } } for (int i = 0; i < m; i++) { if (h[h.size() - 1][i] == INT64_MAX) std::cout << "-1\n"; else { std::cout << h[h.size() - 1][i] << "\n"; } } return 0; } |