#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define f first
#define s second
ll maxn=7003, N, K, M, inf=1e17+999;
vector<ll> ans(maxn, inf);
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> N >> K >> M;
vector<vector<pair<ll, ll>>> v(maxn);
ans[0]=0;
for (int i=0; i<N; i++){
ll a, b, c;
cin >> a >> b >> c;
b%=M;
if (K==1) ans[b]=min(ans[b], c);
v[a].push_back({b, c});
}
for (int i=1; i<=K; i++) {
if (v[i].empty()) {
cout << "0" << "\n";
for (int j = 1; j < M; j++) {
cout << "-1" << "\n";
}
return 0;
}
sort(v[i].begin(), v[i].end());
}
for (int i=1; i<=K; i++) {
for (int j=1; j<v[i].size(); j++){
if (v[i][j-1].f==v[i][j].f){
v[i][j-1].s=min(v[i][j].s, v[i][j-1].s);
v[i].erase(v[i].begin() + j);
j--;
}
}
}
vector<pair<ll, ll>> ost=v[1];
for (int i = 2; i <= K; i++) {
vector<pair<ll, ll>> pop, vis(M+1, {inf, inf});
ll ov=0;
for (int j = 0; j < v[i].size(); j++) {
for (int k = 0; k < ost.size(); k++) {
ll r = v[i][j].f + ost[k].f, z = v[i][j].s + ost[k].s;
r%=M;
if (i!=K && vis[r].f>z) {
vis[r].f=z;
if (vis[r].s!=inf){
pop[vis[r].s].s=z;
}
else {
vis[r].s=ov;
pop.push_back({r, z});
ov++;
}
}
if (i==K && ans[r]>z) {
ans[r]=z;
pop.push_back({r, z});
}
}
}
ost=pop;
}
vector<pair<ll, ll>> vis(M+1, {inf, inf});
while (!ost.empty()) {
for (int i = 1; i <= K; i++) {
vector<pair<ll, ll>> pop;
vector<int> visR;
ll ov=0;
for (int j = 0; j < v[i].size(); j++) {
for (int k = 0; k < ost.size(); k++) {
ll r = v[i][j].f + ost[k].f, z = v[i][j].s + ost[k].s;
r%=M;
if (i!=K && vis[r].f>z) {
visR.push_back(r);
vis[r].f=z;
if (vis[r].s!=inf){
pop[vis[r].s].s=z;
}
else {
vis[r].s=ov;
pop.push_back({r, z});
ov++;
}
}
if (i==K && ans[r]>z) {
ans[r]=z;
pop.push_back({r, z});
}
}
}
for (int r = 0; r < visR.size(); r++) {
vis[visR[r]] = {inf, inf};
}
ost=pop;
}
}
for (int i=0; i<M; i++){
if (ans[i]==inf) ans[i]=-1;
cout << ans[i] << "\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 | #include <bits/stdc++.h> using namespace std; #define ll long long #define f first #define s second ll maxn=7003, N, K, M, inf=1e17+999; vector<ll> ans(maxn, inf); int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> N >> K >> M; vector<vector<pair<ll, ll>>> v(maxn); ans[0]=0; for (int i=0; i<N; i++){ ll a, b, c; cin >> a >> b >> c; b%=M; if (K==1) ans[b]=min(ans[b], c); v[a].push_back({b, c}); } for (int i=1; i<=K; i++) { if (v[i].empty()) { cout << "0" << "\n"; for (int j = 1; j < M; j++) { cout << "-1" << "\n"; } return 0; } sort(v[i].begin(), v[i].end()); } for (int i=1; i<=K; i++) { for (int j=1; j<v[i].size(); j++){ if (v[i][j-1].f==v[i][j].f){ v[i][j-1].s=min(v[i][j].s, v[i][j-1].s); v[i].erase(v[i].begin() + j); j--; } } } vector<pair<ll, ll>> ost=v[1]; for (int i = 2; i <= K; i++) { vector<pair<ll, ll>> pop, vis(M+1, {inf, inf}); ll ov=0; for (int j = 0; j < v[i].size(); j++) { for (int k = 0; k < ost.size(); k++) { ll r = v[i][j].f + ost[k].f, z = v[i][j].s + ost[k].s; r%=M; if (i!=K && vis[r].f>z) { vis[r].f=z; if (vis[r].s!=inf){ pop[vis[r].s].s=z; } else { vis[r].s=ov; pop.push_back({r, z}); ov++; } } if (i==K && ans[r]>z) { ans[r]=z; pop.push_back({r, z}); } } } ost=pop; } vector<pair<ll, ll>> vis(M+1, {inf, inf}); while (!ost.empty()) { for (int i = 1; i <= K; i++) { vector<pair<ll, ll>> pop; vector<int> visR; ll ov=0; for (int j = 0; j < v[i].size(); j++) { for (int k = 0; k < ost.size(); k++) { ll r = v[i][j].f + ost[k].f, z = v[i][j].s + ost[k].s; r%=M; if (i!=K && vis[r].f>z) { visR.push_back(r); vis[r].f=z; if (vis[r].s!=inf){ pop[vis[r].s].s=z; } else { vis[r].s=ov; pop.push_back({r, z}); ov++; } } if (i==K && ans[r]>z) { ans[r]=z; pop.push_back({r, z}); } } } for (int r = 0; r < visR.size(); r++) { vis[visR[r]] = {inf, inf}; } ost=pop; } } for (int i=0; i<M; i++){ if (ans[i]==inf) ans[i]=-1; cout << ans[i] << "\n"; } return 0; } |
English