#include <bits/stdc++.h> #define all(x) (x).begin(),(x).end() using namespace std; using ll = long long; using ld = long double; //#define int ll #define sz(x) ((int)(x).size()) using pii = pair<int,int>; using tii = tuple<int,int,int>; const ll infll = ((ll)1e18) + 5; signed main() { cin.tie(0) -> sync_with_stdio(0); int n, k, m; cin >> n >> k >> m; vector<tii> v(n); for(auto &[color, mass, price] : v) cin >> color >> mass >> price; sort(all(v)); vector<ll> rucs[2]; rucs[0].assign(m, infll); rucs[1].assign(m, infll); rucs[0][0] = 0; int lastcol = 1; for(auto &[color, mass, price] : v) { if(color - lastcol > 1) { cout << "0\n"; for(int i = 1; i < m; i++) cout << "-1\n"; exit(0); } //cerr << color << ' ' << mass << ' ' << price << '\t' << lastcol << '\n'; if(color > lastcol) { swap(rucs[0], rucs[1]); rucs[1].assign(m, infll); } for(int i = 0; i < m; i++) rucs[1][(i + mass) % m] = min(rucs[1][(i + mass) % m], rucs[0][i] + price); lastcol = color; } if(lastcol != k) { cout << "0\n"; for(int i = 1; i < m; i++) cout << "-1\n"; exit(0); } //for(auto x : rucs[1]) //cerr << x << ' '; //cerr << '\n'; vector<ll> rez; rez.assign(m, infll); rez[0] = 0; priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> heap; heap.emplace(0, 0); while(!heap.empty()) { auto [C, p] = heap.top(); heap.pop(); if(C != rez[p]) continue; for(int j = 1; j < m; j++) { if(rez[(p + j) % m] > rez[p] + rucs[1][j]) { rez[(p + j) % m] = rez[p] + rucs[1][j]; heap.emplace(rez[p] + rucs[1][j], (p + j) % m); } } } for(auto x : rez) cout << (x == infll? -1 : x) << '\n'; } /** Anul asta nu se da centroid -- Rugaciunile mele */
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 | #include <bits/stdc++.h> #define all(x) (x).begin(),(x).end() using namespace std; using ll = long long; using ld = long double; //#define int ll #define sz(x) ((int)(x).size()) using pii = pair<int,int>; using tii = tuple<int,int,int>; const ll infll = ((ll)1e18) + 5; signed main() { cin.tie(0) -> sync_with_stdio(0); int n, k, m; cin >> n >> k >> m; vector<tii> v(n); for(auto &[color, mass, price] : v) cin >> color >> mass >> price; sort(all(v)); vector<ll> rucs[2]; rucs[0].assign(m, infll); rucs[1].assign(m, infll); rucs[0][0] = 0; int lastcol = 1; for(auto &[color, mass, price] : v) { if(color - lastcol > 1) { cout << "0\n"; for(int i = 1; i < m; i++) cout << "-1\n"; exit(0); } //cerr << color << ' ' << mass << ' ' << price << '\t' << lastcol << '\n'; if(color > lastcol) { swap(rucs[0], rucs[1]); rucs[1].assign(m, infll); } for(int i = 0; i < m; i++) rucs[1][(i + mass) % m] = min(rucs[1][(i + mass) % m], rucs[0][i] + price); lastcol = color; } if(lastcol != k) { cout << "0\n"; for(int i = 1; i < m; i++) cout << "-1\n"; exit(0); } //for(auto x : rucs[1]) //cerr << x << ' '; //cerr << '\n'; vector<ll> rez; rez.assign(m, infll); rez[0] = 0; priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> heap; heap.emplace(0, 0); while(!heap.empty()) { auto [C, p] = heap.top(); heap.pop(); if(C != rez[p]) continue; for(int j = 1; j < m; j++) { if(rez[(p + j) % m] > rez[p] + rucs[1][j]) { rez[(p + j) % m] = rez[p] + rucs[1][j]; heap.emplace(rez[p] + rucs[1][j], (p + j) % m); } } } for(auto x : rez) cout << (x == infll? -1 : x) << '\n'; } /** Anul asta nu se da centroid -- Rugaciunile mele */ |