#include <bits/stdc++.h>
#define FOR(i, a, b) for(int i =(a); i < (b); ++i)
#define re(i, n) FOR(i, 1, n)
#define ford(i, a, b) for(int i = (a); i >= (b); --i)
#define rep(i, n) for(int i = 0;i <(n); ++i)
#define all(x) (x).begin(), (x).end()
#define sz(x) (int) (x).size()
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
typedef vector<ll> vll;
typedef vector<int> vi;
typedef vector<pll> vpll;
typedef vector<pii> vpii;
const ll inf = 1e18;
const int N = 7002;
int n,k,m;
vector<vpll> col;
ll dp1[N][N]; //najmniejszy koszt przejscia o +j uzywajac pierwszych i kolorow
ll edge[N];
ll dist[N];
bool vis[N];
ll mod_sub(ll a, ll b)
{
return a - b < 0 ? a - b + m : a - b;
}
ll mod_add(ll a, ll b)
{
return a + b >= m ? a + b - m : a + b;
}
void dijkstra(int s)
{
dist[s] = 0;
rep(i, m)
{
ll v = -1;
ll d = inf;
rep(j, m)
{
if (!vis[j] && (v == -1 || d > dist[j]))
{
d = dist[j];
v = j;
}
}
if (d >= inf) return;
vis[v] = true;
for (int i = 1; i < m; i++)
{
ll u = mod_add(v, i);
ll nd = d + edge[i];
if (dist[u] > nd)
{
dist[u] = nd;
}
}
}
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n >> k >> m;
col.resize(k);
rep(i, k+1)
{
rep(j, m)
{
dp1[i][j] = inf;
}
}
dp1[0][0] = 0;
rep(i, n)
{
ll ki, mi, ci;
cin >> ki >> mi >> ci;
ki--;
col[ki].push_back({ci, mi});
}
for (int i = 1; i <= k; i++)
{
for (pll v : col[i-1])
{
ll ci = v.first;
ll mi = v.second;
for (int j = 0; j < m; j++)
{
dp1[i][j] = min(dp1[i][j], dp1[i-1][mod_sub(j, mi)] + ci);
}
}
}
rep(i, m) edge[i] = dp1[k][i];
rep(i, m) dist[i] = inf;
dijkstra(0);
rep(i, m)
{
if (dist[i] < inf) cout << dist[i] << '\n';
else cout << "-1\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 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 | #include <bits/stdc++.h> #define FOR(i, a, b) for(int i =(a); i < (b); ++i) #define re(i, n) FOR(i, 1, n) #define ford(i, a, b) for(int i = (a); i >= (b); --i) #define rep(i, n) for(int i = 0;i <(n); ++i) #define all(x) (x).begin(), (x).end() #define sz(x) (int) (x).size() using namespace std; typedef long long ll; typedef pair<ll, ll> pll; typedef pair<int, int> pii; typedef vector<ll> vll; typedef vector<int> vi; typedef vector<pll> vpll; typedef vector<pii> vpii; const ll inf = 1e18; const int N = 7002; int n,k,m; vector<vpll> col; ll dp1[N][N]; //najmniejszy koszt przejscia o +j uzywajac pierwszych i kolorow ll edge[N]; ll dist[N]; bool vis[N]; ll mod_sub(ll a, ll b) { return a - b < 0 ? a - b + m : a - b; } ll mod_add(ll a, ll b) { return a + b >= m ? a + b - m : a + b; } void dijkstra(int s) { dist[s] = 0; rep(i, m) { ll v = -1; ll d = inf; rep(j, m) { if (!vis[j] && (v == -1 || d > dist[j])) { d = dist[j]; v = j; } } if (d >= inf) return; vis[v] = true; for (int i = 1; i < m; i++) { ll u = mod_add(v, i); ll nd = d + edge[i]; if (dist[u] > nd) { dist[u] = nd; } } } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> k >> m; col.resize(k); rep(i, k+1) { rep(j, m) { dp1[i][j] = inf; } } dp1[0][0] = 0; rep(i, n) { ll ki, mi, ci; cin >> ki >> mi >> ci; ki--; col[ki].push_back({ci, mi}); } for (int i = 1; i <= k; i++) { for (pll v : col[i-1]) { ll ci = v.first; ll mi = v.second; for (int j = 0; j < m; j++) { dp1[i][j] = min(dp1[i][j], dp1[i-1][mod_sub(j, mi)] + ci); } } } rep(i, m) edge[i] = dp1[k][i]; rep(i, m) dist[i] = inf; dijkstra(0); rep(i, m) { if (dist[i] < inf) cout << dist[i] << '\n'; else cout << "-1\n"; } } |
English