#include <bits/stdc++.h>
using namespace std;
struct trojka{
long long kolor;
long long waga;
long long cena;
};
bool comp_tr(trojka a,trojka b){
return a.kolor < b.kolor;
}
bool czy_zrobione[7001];
long long arr_new[7001],arr_old[7001];
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
long long n,k,m;
cin >> n >> k >> m;
vector <trojka> Input;
Input.push_back({-1,-1,-1});
for (long long i = 1; i <= n;i++){
long long a,b,c;
cin >> a >> b >> c;
Input.push_back({a,b,c});
}
sort(Input.begin(),Input.end(),comp_tr);
for (long long i = 0; i < m;i++){
arr_new[i] = -1;
arr_old[i] = -1;
}
arr_old[0] = 0;
long long licz = 1;
for (long long i = 1; i <= k;i++){
bool did_we_do = 0;
while(licz <= n && Input[licz].kolor == i){
did_we_do = 1;
for (long long j = 0; j < m;j++){
if(arr_old[j] != -1){
arr_new[(j + Input[licz].waga) % m] = min(arr_new[(j + Input[licz].waga) % m],arr_old[j] + Input[licz].cena);
if(arr_new[(j + Input[licz].waga) % m] == -1){
arr_new[(j + Input[licz].waga) % m] = arr_old[j] + Input[licz].cena;
}
}
}
licz++;
}
for (long long j = 0; j < m;j++){
arr_old[j] = arr_new[j];
arr_new[j] = -1;
}
}
arr_old[0] = 0;
for (long long i = 0; i < m;i++)czy_zrobione[i] = 0;
priority_queue < pair <long long,long long> > Q;
for (long long i = 0; i < m;i++){
if(arr_old[i] != -1){
Q.push({-arr_old[i],i});
}
}
while(Q.size() > 0){
long long war = -Q.top().first;
long long ind = Q.top().second;
Q.pop();
if(czy_zrobione[ind] == 0){
czy_zrobione[ind] = 1;
arr_old[ind] = war;
for (long long j = 0; j < m;j++){
if(arr_old[j] != -1 && czy_zrobione[(ind + j)%m] == 0){
if(arr_old[(ind+j)%m] == -1 || arr_old[(ind+j)%m] > arr_old[j] + war){
Q.push({-arr_old[j] - war,(ind + j)%m});
arr_old[(ind+j)%m] = arr_old[j] + war;
}
}
}
}
}
for (long long i = 0; i < m;i++){
cout << arr_old[i] << '\n';
}
}
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 | #include <bits/stdc++.h> using namespace std; struct trojka{ long long kolor; long long waga; long long cena; }; bool comp_tr(trojka a,trojka b){ return a.kolor < b.kolor; } bool czy_zrobione[7001]; long long arr_new[7001],arr_old[7001]; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); long long n,k,m; cin >> n >> k >> m; vector <trojka> Input; Input.push_back({-1,-1,-1}); for (long long i = 1; i <= n;i++){ long long a,b,c; cin >> a >> b >> c; Input.push_back({a,b,c}); } sort(Input.begin(),Input.end(),comp_tr); for (long long i = 0; i < m;i++){ arr_new[i] = -1; arr_old[i] = -1; } arr_old[0] = 0; long long licz = 1; for (long long i = 1; i <= k;i++){ bool did_we_do = 0; while(licz <= n && Input[licz].kolor == i){ did_we_do = 1; for (long long j = 0; j < m;j++){ if(arr_old[j] != -1){ arr_new[(j + Input[licz].waga) % m] = min(arr_new[(j + Input[licz].waga) % m],arr_old[j] + Input[licz].cena); if(arr_new[(j + Input[licz].waga) % m] == -1){ arr_new[(j + Input[licz].waga) % m] = arr_old[j] + Input[licz].cena; } } } licz++; } for (long long j = 0; j < m;j++){ arr_old[j] = arr_new[j]; arr_new[j] = -1; } } arr_old[0] = 0; for (long long i = 0; i < m;i++)czy_zrobione[i] = 0; priority_queue < pair <long long,long long> > Q; for (long long i = 0; i < m;i++){ if(arr_old[i] != -1){ Q.push({-arr_old[i],i}); } } while(Q.size() > 0){ long long war = -Q.top().first; long long ind = Q.top().second; Q.pop(); if(czy_zrobione[ind] == 0){ czy_zrobione[ind] = 1; arr_old[ind] = war; for (long long j = 0; j < m;j++){ if(arr_old[j] != -1 && czy_zrobione[(ind + j)%m] == 0){ if(arr_old[(ind+j)%m] == -1 || arr_old[(ind+j)%m] > arr_old[j] + war){ Q.push({-arr_old[j] - war,(ind + j)%m}); arr_old[(ind+j)%m] = arr_old[j] + war; } } } } } for (long long i = 0; i < m;i++){ cout << arr_old[i] << '\n'; } } |
English