#include<bits/stdc++.h> using namespace std; typedef long long ll; int main() { ios_base::sync_with_stdio(0); cin.tie(0); ll n,k,m; cin>>n>>k>>m; vector <pair <ll, pair <ll,ll> > > v(n); for(ll i=0;i<n;i++) { cin>>v[i].first>>v[i].second.first>>v[i].second.second; } sort(v.begin(),v.end()); vector <vector <ll> > dp(k+2,vector <ll> (m+2,1e15)); ll x=0; while(v[x].first==1) { dp[1][(v[x].second.first)%m]=min(dp[1][(v[x].second.first)%m], v[x].second.second); x++; } /*for(ll i=0;i<m;i++) { cout<<dp[1][i]<<" "; } cout<<"\n";*/ for(ll i=x;i<n; ) { ll q=v[i].first; while(i<n && v[i].first==q) { for(ll j=0;j<m;j++) { ll dest=(j+v[i].second.first)%m; dp[q][dest]=min(dp[q][dest], dp[q-1][j]+v[i].second.second); } i++; } } /*for(ll i=1;i<k;i++) { for(ll j=0;j<m;j++) { cout<<dp[i][j]<<" "; } cout<<endl; }*/ vector <pair <ll,ll> > pom; pom.reserve(m); for(ll i=1;i<m;i++) { //cout<<dp[k][i]<<" "; if(dp[k][i]!=1e15) { pom.push_back({dp[k][i],i}); } } sort(pom.begin(),pom.end()); vector <ll> wynik(m, 1e15); wynik[0]=0; for(ll i=0;i<pom.size();i++) { vector <ll> vis(m,0); //cout<<pom[i].first<<" "<<pom[i].second<<"\n"; for(ll j=0;j<m;j++) { if(wynik[j]!=1e15&&vis[j]==0) { ll start=j; ll x=start; vis[start]=1; bool pocz=1; while(x!=start||pocz==1) { if(wynik[x]+pom[i].first<wynik[(x+pom[i].second)%m]) { wynik[(x+pom[i].second)%m]=wynik[x]+pom[i].first; x=(x+pom[i].second)%m; pocz=0; vis[x]=1; } else break; } } } } for(ll i=0;i<m;i++) { if(wynik[i]==1e15) { wynik[i]=-1; } cout<<wynik[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 | #include<bits/stdc++.h> using namespace std; typedef long long ll; int main() { ios_base::sync_with_stdio(0); cin.tie(0); ll n,k,m; cin>>n>>k>>m; vector <pair <ll, pair <ll,ll> > > v(n); for(ll i=0;i<n;i++) { cin>>v[i].first>>v[i].second.first>>v[i].second.second; } sort(v.begin(),v.end()); vector <vector <ll> > dp(k+2,vector <ll> (m+2,1e15)); ll x=0; while(v[x].first==1) { dp[1][(v[x].second.first)%m]=min(dp[1][(v[x].second.first)%m], v[x].second.second); x++; } /*for(ll i=0;i<m;i++) { cout<<dp[1][i]<<" "; } cout<<"\n";*/ for(ll i=x;i<n; ) { ll q=v[i].first; while(i<n && v[i].first==q) { for(ll j=0;j<m;j++) { ll dest=(j+v[i].second.first)%m; dp[q][dest]=min(dp[q][dest], dp[q-1][j]+v[i].second.second); } i++; } } /*for(ll i=1;i<k;i++) { for(ll j=0;j<m;j++) { cout<<dp[i][j]<<" "; } cout<<endl; }*/ vector <pair <ll,ll> > pom; pom.reserve(m); for(ll i=1;i<m;i++) { //cout<<dp[k][i]<<" "; if(dp[k][i]!=1e15) { pom.push_back({dp[k][i],i}); } } sort(pom.begin(),pom.end()); vector <ll> wynik(m, 1e15); wynik[0]=0; for(ll i=0;i<pom.size();i++) { vector <ll> vis(m,0); //cout<<pom[i].first<<" "<<pom[i].second<<"\n"; for(ll j=0;j<m;j++) { if(wynik[j]!=1e15&&vis[j]==0) { ll start=j; ll x=start; vis[start]=1; bool pocz=1; while(x!=start||pocz==1) { if(wynik[x]+pom[i].first<wynik[(x+pom[i].second)%m]) { wynik[(x+pom[i].second)%m]=wynik[x]+pom[i].first; x=(x+pom[i].second)%m; pocz=0; vis[x]=1; } else break; } } } } for(ll i=0;i<m;i++) { if(wynik[i]==1e15) { wynik[i]=-1; } cout<<wynik[i]<<"\n"; } return 0; } |