#include<iostream> #include<algorithm> #include<vector> #include<cmath> #include<ctime> using namespace std; int main() { ios::sync_with_stdio(0); clock_t t0,t; t0 = clock(); int N,K,M; cin>>N>>K>>M; const int q = 7000; long long k[q],m[q],c[q]; vector< pair<long long, pair<long long, long long> > > v; for(int i=0; i<N; ++i) { cin>>k[i]>>m[i]>>c[i]; m[i] = m[i] % M; v.push_back(make_pair(k[i], make_pair(m[i], c[i]))); } sort(v.begin(),v.end()); for(int i=0; i<N; ++i) { k[i] = v[i].first; m[i] = v[i].second.first; c[i] = v[i].second.second; } bool CZ[q+1]; for(int i=1; i<=K; ++i) CZ[i] = false; for(int i=0; i<N; ++i) { CZ[k[i]] = true; } for(int i=1; i<=K; ++i) if(CZ[i] == false) { cout<<0<<endl; for(int j=1; j<M; ++j) cout<<"-1"<<endl; return 0; } long long T[q]; long long tab[q][q]; for(int i=0; i<M; ++i) T[i] = -1; int C = 1; for(int i=0; i<N; ++i) { int p = 0; while(i < N && k[i] == C) { if(k[i] == 1) { if(T[m[i]] == -1) T[m[i]] = c[i]; else T[m[i]] = min(T[m[i]], c[i]); } else { for(int j=0; j<M; ++j) tab[p][j] = T[(j - m[i] + M) % M]; for(int j=0; j<M; ++j) if(tab[p][j] != -1) tab[p][j] += c[i]; } p++; i++; } if(C != 1) { for(int j=0; j<M; ++j) { long long Min = (long long)1 << 60; for(int e=0; e<p; ++e) { if(tab[e][j] != -1) Min = min(Min, tab[e][j]); } if(Min < ((long long)1 << 60)) T[j] = Min; else T[j] = -1; } } i--; C++; } long long B[q]; for(int i=0; i<15; ++i) { for(int j=0; j<M; ++j) B[j] = -1; for(int j=0; j<M; ++j) { for(int l=0; l<M; ++l) { if(T[j] != -1 && T[l] != -1) { if(B[(j + l) % M] == -1) B[(j + l) % M] = T[j] + T[l]; else B[(j + l) % M] = min(B[(j + l) % M], T[j] + T[l]); } } } for(int j=0; j<M; ++j) { if(T[j] != -1 && B[j] != -1) T[j] = min(T[j],B[j]); else if(T[j] == -1) T[j] = B[j]; } t = clock() - t0; if(((float)t)/CLOCKS_PER_SEC > 2.5) break; } cout<<0<<endl; for(int i=1; i<M; ++i) cout<<T[i]<<endl; 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 | #include<iostream> #include<algorithm> #include<vector> #include<cmath> #include<ctime> using namespace std; int main() { ios::sync_with_stdio(0); clock_t t0,t; t0 = clock(); int N,K,M; cin>>N>>K>>M; const int q = 7000; long long k[q],m[q],c[q]; vector< pair<long long, pair<long long, long long> > > v; for(int i=0; i<N; ++i) { cin>>k[i]>>m[i]>>c[i]; m[i] = m[i] % M; v.push_back(make_pair(k[i], make_pair(m[i], c[i]))); } sort(v.begin(),v.end()); for(int i=0; i<N; ++i) { k[i] = v[i].first; m[i] = v[i].second.first; c[i] = v[i].second.second; } bool CZ[q+1]; for(int i=1; i<=K; ++i) CZ[i] = false; for(int i=0; i<N; ++i) { CZ[k[i]] = true; } for(int i=1; i<=K; ++i) if(CZ[i] == false) { cout<<0<<endl; for(int j=1; j<M; ++j) cout<<"-1"<<endl; return 0; } long long T[q]; long long tab[q][q]; for(int i=0; i<M; ++i) T[i] = -1; int C = 1; for(int i=0; i<N; ++i) { int p = 0; while(i < N && k[i] == C) { if(k[i] == 1) { if(T[m[i]] == -1) T[m[i]] = c[i]; else T[m[i]] = min(T[m[i]], c[i]); } else { for(int j=0; j<M; ++j) tab[p][j] = T[(j - m[i] + M) % M]; for(int j=0; j<M; ++j) if(tab[p][j] != -1) tab[p][j] += c[i]; } p++; i++; } if(C != 1) { for(int j=0; j<M; ++j) { long long Min = (long long)1 << 60; for(int e=0; e<p; ++e) { if(tab[e][j] != -1) Min = min(Min, tab[e][j]); } if(Min < ((long long)1 << 60)) T[j] = Min; else T[j] = -1; } } i--; C++; } long long B[q]; for(int i=0; i<15; ++i) { for(int j=0; j<M; ++j) B[j] = -1; for(int j=0; j<M; ++j) { for(int l=0; l<M; ++l) { if(T[j] != -1 && T[l] != -1) { if(B[(j + l) % M] == -1) B[(j + l) % M] = T[j] + T[l]; else B[(j + l) % M] = min(B[(j + l) % M], T[j] + T[l]); } } } for(int j=0; j<M; ++j) { if(T[j] != -1 && B[j] != -1) T[j] = min(T[j],B[j]); else if(T[j] == -1) T[j] = B[j]; } t = clock() - t0; if(((float)t)/CLOCKS_PER_SEC > 2.5) break; } cout<<0<<endl; for(int i=1; i<M; ++i) cout<<T[i]<<endl; return 0; } |