#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
struct zelek {
int masa;
long long cena;
};
std::vector<zelek> kolory[7001];
long long tablica[7001][7001];
int main() {
int n, k, m, K, M, C;
std::cin >> n >> k >> m;
for (int i = 0; i < n; ++i) {
std::cin >> K >> M >> C;
kolory[K].push_back({ M,C });
}
for (int i = 0; i < kolory[1].size(); i++)
if (tablica[1][kolory[1][i].masa % m] == 0 || tablica[1][kolory[1][i].masa % m] > kolory[1][i].cena)
tablica[1][kolory[1][i].masa % m] = kolory[1][i].cena;
for (int i = 2; i <= k; i++)
for (int j = 0; j < kolory[i].size(); j++)
for (int l = 0; l < m; l++)
if (tablica[i - 1][l] != 0 && (tablica[i][(kolory[i][j].masa + l) % m] > kolory[i][j].cena + tablica[i - 1][l] || tablica[i][(kolory[i][j].masa + l) % m] == 0))
tablica[i][(kolory[i][j].masa + l) % m] = kolory[i][j].cena + tablica[i-1][l];
bool fafa;
std::vector<int> v;
std::set<std::pair<long long, int>> s;
std::pair<long long, int> num;
for (int i = 0; i < m; i++)
if (tablica[k][i])
v.push_back(i);
for (int i = 0; i < v.size(); i++)
for (int j = i; j < v.size(); j++)
s.insert({ tablica[k][v[i]] + tablica[k][v[j]], (v[i] + v[j]) % m });
for (auto itr = s.begin(); itr != s.end(); ++itr) {
fafa = false;
num = *itr;
if (tablica[k][num.second] == 0) {
v.push_back(num.second);
fafa = true;
}
else if (num.first < tablica[k][num.second]) {
for (int i = 0; i < v.size(); i++)
s.erase({ tablica[k][num.second] + tablica[k][v[i]], (num.second + v[i]) % m });
fafa = true;
}
if (fafa) {
tablica[k][num.second] = num.first;
for (int i = 0; i < v.size(); i++) {
s.insert({ tablica[k][num.second] + tablica[k][v[i]], (num.second + v[i]) % m });
}
}
}
std::cout << 0;
for (int i = 1; i < m; i++)
if (tablica[k][i])
std::cout << '\n' << tablica[k][i];
else
std::cout << '\n' << -1;
}
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 | #include <iostream> #include <algorithm> #include <vector> #include <set> struct zelek { int masa; long long cena; }; std::vector<zelek> kolory[7001]; long long tablica[7001][7001]; int main() { int n, k, m, K, M, C; std::cin >> n >> k >> m; for (int i = 0; i < n; ++i) { std::cin >> K >> M >> C; kolory[K].push_back({ M,C }); } for (int i = 0; i < kolory[1].size(); i++) if (tablica[1][kolory[1][i].masa % m] == 0 || tablica[1][kolory[1][i].masa % m] > kolory[1][i].cena) tablica[1][kolory[1][i].masa % m] = kolory[1][i].cena; for (int i = 2; i <= k; i++) for (int j = 0; j < kolory[i].size(); j++) for (int l = 0; l < m; l++) if (tablica[i - 1][l] != 0 && (tablica[i][(kolory[i][j].masa + l) % m] > kolory[i][j].cena + tablica[i - 1][l] || tablica[i][(kolory[i][j].masa + l) % m] == 0)) tablica[i][(kolory[i][j].masa + l) % m] = kolory[i][j].cena + tablica[i-1][l]; bool fafa; std::vector<int> v; std::set<std::pair<long long, int>> s; std::pair<long long, int> num; for (int i = 0; i < m; i++) if (tablica[k][i]) v.push_back(i); for (int i = 0; i < v.size(); i++) for (int j = i; j < v.size(); j++) s.insert({ tablica[k][v[i]] + tablica[k][v[j]], (v[i] + v[j]) % m }); for (auto itr = s.begin(); itr != s.end(); ++itr) { fafa = false; num = *itr; if (tablica[k][num.second] == 0) { v.push_back(num.second); fafa = true; } else if (num.first < tablica[k][num.second]) { for (int i = 0; i < v.size(); i++) s.erase({ tablica[k][num.second] + tablica[k][v[i]], (num.second + v[i]) % m }); fafa = true; } if (fafa) { tablica[k][num.second] = num.first; for (int i = 0; i < v.size(); i++) { s.insert({ tablica[k][num.second] + tablica[k][v[i]], (num.second + v[i]) % m }); } } } std::cout << 0; for (int i = 1; i < m; i++) if (tablica[k][i]) std::cout << '\n' << tablica[k][i]; else std::cout << '\n' << -1; } |
English