#ifdef DEBUG #define _GLIBCXX_DEBUG #endif //#pragma GCC optimize("O3") #include<bits/stdc++.h> using namespace std; #define pb push_back typedef long long ll; typedef long double ld; int n, k, m; const int maxN = 7005; const ll INF = 1e18; ll dp[maxN]; ll ndp[maxN]; vector<pair<int,int>> clr[maxN]; bool used[maxN]; ll S[maxN]; int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); #ifdef DEBUG freopen("input.txt", "r", stdin); #endif cin >> n >> k >> m; for (int i = 0; i < n; i++) { int K, M, C; cin >> K >> M >> C; M %= m; K--; clr[K].emplace_back(M, C); } dp[0] = 0; for (int z = 1; z < m; z++) dp[z] = INF; for (int i = 0; i < k; i++) { for (int z = 0; z < m; z++) ndp[z] = INF; for (auto& it : clr[i]) { for (int z = 0; z < m; z++) { int tz = z + it.first; if (tz >= m) tz -= m; ndp[tz] = min(ndp[tz], dp[z] + it.second); } } for (int z = 0; z < m; z++) { dp[z] = ndp[z]; } } S[0] = 0; for (int z = 1; z < m; z++) { S[z] = INF; } for (int z = 0; z < m; z++) { int who = -1; for (int pz = 0; pz < m; pz++) { if (!used[pz] && (who == -1 || S[pz] < S[who])) { who = pz; } } assert(who != -1); used[who] = true; for (int pz = 0; pz < m; pz++) { int tz = who + pz; if (tz >= m) tz -= m; S[tz] = min(S[tz], S[who] + dp[pz]); } } //7000 * 7000 * 10^9 for (int z = 0; z < m; z++) { if (S[z] > (ll)5e17) S[z] = -1; cout << S[z] << '\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 73 74 | #ifdef DEBUG #define _GLIBCXX_DEBUG #endif //#pragma GCC optimize("O3") #include<bits/stdc++.h> using namespace std; #define pb push_back typedef long long ll; typedef long double ld; int n, k, m; const int maxN = 7005; const ll INF = 1e18; ll dp[maxN]; ll ndp[maxN]; vector<pair<int,int>> clr[maxN]; bool used[maxN]; ll S[maxN]; int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); #ifdef DEBUG freopen("input.txt", "r", stdin); #endif cin >> n >> k >> m; for (int i = 0; i < n; i++) { int K, M, C; cin >> K >> M >> C; M %= m; K--; clr[K].emplace_back(M, C); } dp[0] = 0; for (int z = 1; z < m; z++) dp[z] = INF; for (int i = 0; i < k; i++) { for (int z = 0; z < m; z++) ndp[z] = INF; for (auto& it : clr[i]) { for (int z = 0; z < m; z++) { int tz = z + it.first; if (tz >= m) tz -= m; ndp[tz] = min(ndp[tz], dp[z] + it.second); } } for (int z = 0; z < m; z++) { dp[z] = ndp[z]; } } S[0] = 0; for (int z = 1; z < m; z++) { S[z] = INF; } for (int z = 0; z < m; z++) { int who = -1; for (int pz = 0; pz < m; pz++) { if (!used[pz] && (who == -1 || S[pz] < S[who])) { who = pz; } } assert(who != -1); used[who] = true; for (int pz = 0; pz < m; pz++) { int tz = who + pz; if (tz >= m) tz -= m; S[tz] = min(S[tz], S[who] + dp[pz]); } } //7000 * 7000 * 10^9 for (int z = 0; z < m; z++) { if (S[z] > (ll)5e17) S[z] = -1; cout << S[z] << '\n'; } return 0; } |