#include <bits/stdc++.h> using namespace std; using ll = long long; const ll INF = 1e18 + 7;; int n, k, m; vector <ll> merge(vector <ll> &a, vector <ll> &b) { vector <ll> ans(m, INF); vector <pair <int, ll>> tmp1, tmp2; for (int i = 0; i < m; i++) { if (a[i] != INF) tmp1.push_back({i, a[i]}); if (b[i] != INF) tmp2.push_back({i, b[i]}); } for (auto &[x, y] : tmp1) { for (auto &[c, d] : tmp2) { int r = (x + c) % m; ans[r] = min(ans[r], y + d); } } return ans; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> k >> m; vector <vector <ll>> v(k, vector <ll>(m, INF)); vector <int> zlicz(k); for (int i = 0; i < n; i++) { ll a, b, c; cin >> a >> b >> c; a--; if (b == m) b = 0; v[a][b] = min(v[a][b], c); zlicz[a]++; } for (int i = 0; i < k; i++) { if (zlicz[i] == 0) { cout << 0 << '\n'; for (int j = 1; j < m; j++) { cout << -1 << '\n'; } return 0; } } for (int i = k - 1; i >= 1; i--) { v[i - 1] = merge(v[i], v[i - 1]); } vector <ll> ans(m, INF); for (int i = 0; i < m; i++) { ans[i] = v[0][i]; } ans[0] = 0; int cnt = 1; while (cnt) { vector <ll> nxt = merge(ans, ans); cnt = 0; for (int i = 0; i < m; i++) { if (nxt[i] < ans[i]) { ans[i] = nxt[i]; cnt++; } } } for (int i = 0; i < m; i++) { cout << (ans[i] != INF ? ans[i] : -1) << '\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 | #include <bits/stdc++.h> using namespace std; using ll = long long; const ll INF = 1e18 + 7;; int n, k, m; vector <ll> merge(vector <ll> &a, vector <ll> &b) { vector <ll> ans(m, INF); vector <pair <int, ll>> tmp1, tmp2; for (int i = 0; i < m; i++) { if (a[i] != INF) tmp1.push_back({i, a[i]}); if (b[i] != INF) tmp2.push_back({i, b[i]}); } for (auto &[x, y] : tmp1) { for (auto &[c, d] : tmp2) { int r = (x + c) % m; ans[r] = min(ans[r], y + d); } } return ans; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> k >> m; vector <vector <ll>> v(k, vector <ll>(m, INF)); vector <int> zlicz(k); for (int i = 0; i < n; i++) { ll a, b, c; cin >> a >> b >> c; a--; if (b == m) b = 0; v[a][b] = min(v[a][b], c); zlicz[a]++; } for (int i = 0; i < k; i++) { if (zlicz[i] == 0) { cout << 0 << '\n'; for (int j = 1; j < m; j++) { cout << -1 << '\n'; } return 0; } } for (int i = k - 1; i >= 1; i--) { v[i - 1] = merge(v[i], v[i - 1]); } vector <ll> ans(m, INF); for (int i = 0; i < m; i++) { ans[i] = v[0][i]; } ans[0] = 0; int cnt = 1; while (cnt) { vector <ll> nxt = merge(ans, ans); cnt = 0; for (int i = 0; i < m; i++) { if (nxt[i] < ans[i]) { ans[i] = nxt[i]; cnt++; } } } for (int i = 0; i < m; i++) { cout << (ans[i] != INF ? ans[i] : -1) << '\n'; } } |