#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using db = long double;
using pi = pair<int, int>;
using vi = vector<int>;
using vl = vector<ll>;
using vpi = vector<pi>;
#define mp make_pair
#define pb push_back
#define eb emplace_back
#define x first
#define y second
#define sz(x) int((x).size())
#define all(x) (x).begin(), (x).end()
#define rep(i,a,b) for(int i = (a); i < (b); i++)
#define per(i,a,b) for(int i = (b) - 1; i >= (a); i--)
#ifdef LOCAL
template<class A, class B> auto& operator<<(auto &o, pair<A, B> p) { return o << '(' << p.x << ", " << p.y << ')'; }
template<class... A> auto& operator<<(auto &o, tuple<A...> t) {
bool is_first = true;
o << "(";
apply([&o, &is_first](auto... a) {((o << (is_first ? (is_first = false, "") : ", ") << a), ...);}, t);
o << ")";
return o;
}
auto& operator<<(auto& o, auto a) {
bool is_first = true;
o << "{";
for (auto b : a) o << (is_first ? (is_first = false, "") : ", ") << b;
return o << "}";
}
void dump(auto... x) {
bool is_first = true;
((cerr << (is_first ? (is_first = false, "") : ", ") << x), ...) << "\n";
}
#define debug(x...) cerr << "[" #x "]: ", dump(x)
#else
#define debug(...) ;
#endif
template<class T> bool ckmin(T& a, const T& b) { return b < a ? a = b, 1 : 0; }
template<class T> bool ckmax(T& a, const T& b) { return a < b ? a = b, 1 : 0; }
constexpr int N = 7007;
constexpr ll INF = 1e18 + 213742069;
vpi types[N];
ll dp[2][N];
ll res[N];
// mt19937 gen(2137);
// int rand_int(int l, int r) {
// return uniform_int_distribution<int>{l, r}(gen);
// }
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
// int n = 7000, k = rand_int(100, 200), m = 7000;
int n, k, m;
cin >> n >> k >> m;
rep(i, 1, n + 1) {
// int color = rand_int(1, k), mass = rand_int(1, m), price = rand_int(1, 1e9);
int color, mass, price;
cin >> color >> mass >> price;
if (mass == m) mass = 0;
types[color].eb(mass, price);
}
rep(mass, 0, m) dp[0][mass] = dp[1][mass] = INF;
dp[0][0] = 0;
rep(color, 1, k + 1) {
rep(mass, 0, m) dp[color & 1][mass] = INF;
for (const auto &[mass, price] : types[color]) {
int new_mass = mass;
rep(old_mass, 0, m) {
ckmin(dp[color & 1][new_mass], dp[(color & 1) ^ 1][old_mass] + price);
if (++new_mass == m) new_mass = 0;
}
}
}
rep(mass, 0, m) res[mass] = INF;
res[0] = 0;
rep(mass, 0, m) {
if (dp[k & 1][mass] < INF) {
const ll price = dp[k & 1][mass];
const int gcd = __gcd(mass, m);
rep(i, 0, gcd) {
pair<ll, int> start(res[i], i);
int j = i, nxt = i + mass;
if (nxt >= m) nxt -= m;
do {
ckmin(start, mp(res[j], j));
j = nxt;
nxt += mass;
if (nxt >= m) nxt -= m;
} while (j != i);
j = start.y, nxt = start.y + mass;
if (nxt >= m) nxt -= m;
do {
ckmin(res[nxt], res[j] + price);
j = nxt;
nxt += mass;
if (nxt >= m) nxt -= m;
} while (j != start.y);
}
}
}
rep(mass, 0, m) {
if (res[mass] == INF) res[mass] = -1;
cout << res[mass] << "\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 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 127 | #include <bits/stdc++.h> using namespace std; using ll = long long; using ull = unsigned long long; using db = long double; using pi = pair<int, int>; using vi = vector<int>; using vl = vector<ll>; using vpi = vector<pi>; #define mp make_pair #define pb push_back #define eb emplace_back #define x first #define y second #define sz(x) int((x).size()) #define all(x) (x).begin(), (x).end() #define rep(i,a,b) for(int i = (a); i < (b); i++) #define per(i,a,b) for(int i = (b) - 1; i >= (a); i--) #ifdef LOCAL template<class A, class B> auto& operator<<(auto &o, pair<A, B> p) { return o << '(' << p.x << ", " << p.y << ')'; } template<class... A> auto& operator<<(auto &o, tuple<A...> t) { bool is_first = true; o << "("; apply([&o, &is_first](auto... a) {((o << (is_first ? (is_first = false, "") : ", ") << a), ...);}, t); o << ")"; return o; } auto& operator<<(auto& o, auto a) { bool is_first = true; o << "{"; for (auto b : a) o << (is_first ? (is_first = false, "") : ", ") << b; return o << "}"; } void dump(auto... x) { bool is_first = true; ((cerr << (is_first ? (is_first = false, "") : ", ") << x), ...) << "\n"; } #define debug(x...) cerr << "[" #x "]: ", dump(x) #else #define debug(...) ; #endif template<class T> bool ckmin(T& a, const T& b) { return b < a ? a = b, 1 : 0; } template<class T> bool ckmax(T& a, const T& b) { return a < b ? a = b, 1 : 0; } constexpr int N = 7007; constexpr ll INF = 1e18 + 213742069; vpi types[N]; ll dp[2][N]; ll res[N]; // mt19937 gen(2137); // int rand_int(int l, int r) { // return uniform_int_distribution<int>{l, r}(gen); // } signed main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); // int n = 7000, k = rand_int(100, 200), m = 7000; int n, k, m; cin >> n >> k >> m; rep(i, 1, n + 1) { // int color = rand_int(1, k), mass = rand_int(1, m), price = rand_int(1, 1e9); int color, mass, price; cin >> color >> mass >> price; if (mass == m) mass = 0; types[color].eb(mass, price); } rep(mass, 0, m) dp[0][mass] = dp[1][mass] = INF; dp[0][0] = 0; rep(color, 1, k + 1) { rep(mass, 0, m) dp[color & 1][mass] = INF; for (const auto &[mass, price] : types[color]) { int new_mass = mass; rep(old_mass, 0, m) { ckmin(dp[color & 1][new_mass], dp[(color & 1) ^ 1][old_mass] + price); if (++new_mass == m) new_mass = 0; } } } rep(mass, 0, m) res[mass] = INF; res[0] = 0; rep(mass, 0, m) { if (dp[k & 1][mass] < INF) { const ll price = dp[k & 1][mass]; const int gcd = __gcd(mass, m); rep(i, 0, gcd) { pair<ll, int> start(res[i], i); int j = i, nxt = i + mass; if (nxt >= m) nxt -= m; do { ckmin(start, mp(res[j], j)); j = nxt; nxt += mass; if (nxt >= m) nxt -= m; } while (j != i); j = start.y, nxt = start.y + mass; if (nxt >= m) nxt -= m; do { ckmin(res[nxt], res[j] + price); j = nxt; nxt += mass; if (nxt >= m) nxt -= m; } while (j != start.y); } } } rep(mass, 0, m) { if (res[mass] == INF) res[mass] = -1; cout << res[mass] << "\n"; } return 0; } |
English