#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i, j) for (int i = 0; i < (int)(j); i++)
#define st first
#define nd second
const int K = 7005;
const int M = 7005;
map<ll, ll> best_price[K];
vector<pair<ll, ll>> cukierasy[K];
ll plecak[2][M];
vector<pair<ll, ll>> edges;
ll dists[M];
void TEST([[maybe_unused]] int testcase_i) {
ll n, k, m;
cin >> n >> k >> m;
vector<tuple<ll, ll, ll>> v;
rep(i, n) {
ll ki, mi, ci;
cin >> ki >> mi >> ci;
v.emplace_back(ki, mi, ci);
}
for (const auto &[ki, mi, ci] : v) {
if (best_price[ki][mi] == 0) {
best_price[ki][mi] = ci;
} else {
best_price[ki][mi] = min<ll>(ci, best_price[ki][mi]);
}
}
rep(i, k + 1) {
for (const auto &[mi, ci] : best_price[i]) {
cukierasy[i].push_back({mi, ci});
}
}
rep(i, 2) {
rep(j, M) {
plecak[i][j] = 1e18;
}
}
plecak[0][0] = 0;
int prv = 0;
int cur = 1;
rep(i, k) {
rep(j, M) {
plecak[cur][j] = 1e18;
}
for (const auto &[mi, ci] : cukierasy[i + 1]) {
rep(j, M) {
plecak[cur][(j + mi) % m] = min(plecak[cur][(j + mi) % m], plecak[prv][j] + ci);
}
}
prv ^= 1;
cur ^= 1;
}
rep(i, M) {
if (plecak[prv][i] < (ll)1e18) {
edges.emplace_back(i, plecak[prv][i]);
}
}
rep(i, M) {
dists[i] = 1e18;
}
dists[0] = 0;
priority_queue<pair<ll, ll>, vector<pair<ll, ll>>, greater<>> pq;
pq.push({0, 0});
while (pq.size()) {
auto [dst, w] = pq.top();
pq.pop();
if (dists[w] < dst) {
continue;
}
for (const auto &[waga, cena] : edges) {
int nxt_w = (int)(w + waga) % m;
if (dists[nxt_w] > dst + cena) {
dists[nxt_w] = dst + cena;
pq.push({dst + cena, (w + waga) % m});
}
}
}
rep(i, m) {
if (dists[i] > (ll)1e17) {
cout << -1;
} else {
cout << dists[i];
}
cout << "\n";
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cout << setprecision(20) << fixed;
// srand(time(NULL));
int t = 1;
// cin >> t;
rep(i, t) {
TEST(i);
}
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 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | #include <bits/stdc++.h> using namespace std; typedef long long ll; #define rep(i, j) for (int i = 0; i < (int)(j); i++) #define st first #define nd second const int K = 7005; const int M = 7005; map<ll, ll> best_price[K]; vector<pair<ll, ll>> cukierasy[K]; ll plecak[2][M]; vector<pair<ll, ll>> edges; ll dists[M]; void TEST([[maybe_unused]] int testcase_i) { ll n, k, m; cin >> n >> k >> m; vector<tuple<ll, ll, ll>> v; rep(i, n) { ll ki, mi, ci; cin >> ki >> mi >> ci; v.emplace_back(ki, mi, ci); } for (const auto &[ki, mi, ci] : v) { if (best_price[ki][mi] == 0) { best_price[ki][mi] = ci; } else { best_price[ki][mi] = min<ll>(ci, best_price[ki][mi]); } } rep(i, k + 1) { for (const auto &[mi, ci] : best_price[i]) { cukierasy[i].push_back({mi, ci}); } } rep(i, 2) { rep(j, M) { plecak[i][j] = 1e18; } } plecak[0][0] = 0; int prv = 0; int cur = 1; rep(i, k) { rep(j, M) { plecak[cur][j] = 1e18; } for (const auto &[mi, ci] : cukierasy[i + 1]) { rep(j, M) { plecak[cur][(j + mi) % m] = min(plecak[cur][(j + mi) % m], plecak[prv][j] + ci); } } prv ^= 1; cur ^= 1; } rep(i, M) { if (plecak[prv][i] < (ll)1e18) { edges.emplace_back(i, plecak[prv][i]); } } rep(i, M) { dists[i] = 1e18; } dists[0] = 0; priority_queue<pair<ll, ll>, vector<pair<ll, ll>>, greater<>> pq; pq.push({0, 0}); while (pq.size()) { auto [dst, w] = pq.top(); pq.pop(); if (dists[w] < dst) { continue; } for (const auto &[waga, cena] : edges) { int nxt_w = (int)(w + waga) % m; if (dists[nxt_w] > dst + cena) { dists[nxt_w] = dst + cena; pq.push({dst + cena, (w + waga) % m}); } } } rep(i, m) { if (dists[i] > (ll)1e17) { cout << -1; } else { cout << dists[i]; } cout << "\n"; } } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cout << setprecision(20) << fixed; // srand(time(NULL)); int t = 1; // cin >> t; rep(i, t) { TEST(i); } return 0; } |
English