/* Things to notice: 1. do not calculate useless values 2. do not use similar names Things to check: 1. submit the correct file 2. time (it is log^2 or log) 3. memory 4. prove your naive thoughts 5. long long 6. corner case like n=0,1,inf or n=m 7. check if there is a mistake in the ds or other tools you use 8. fileio in some oi-contest 9. module on time 10. the number of a same divisor in a math problem 11. multi-information and queries for dp and ds problems */ #include<bits/stdc++.h> using namespace std; #define int long long #define fi first #define se second #define pii pair<long long,long long> #define mp make_pair #define pb push_back const int inf=0x3f3f3f3f; const int INF=1e18; int cst[2][7005],dp[7005],vis[7005]; vector <pii > vec[7005]; int n,K,m; void solve() { cin>>n>>K>>m; while(n--) { int x,y,z; cin>>x>>y>>z; vec[x].pb(mp(y%m,z)); } int nw=0; memset(cst,0x3f,sizeof(cst)); cst[0][0]=0; for(int i=1;i<=K;i++) { nw^=1; memset(cst[nw],0x3f,sizeof(cst[nw])); for(int j=0;j<vec[i].size();j++) { int u=vec[i][j].fi,w=vec[i][j].se; for(int x=0;x<m;x++) cst[nw][(x+u)%m]=min(cst[nw][(x+u)%m],cst[nw^1][x]+w); } } memset(dp,0x3f,sizeof(dp)); dp[0]=0; for(int _=0;_<m;_++) { int u=-1; for(int j=0;j<m;j++) if(!vis[j]) if(u==-1||dp[j]<dp[u]) u=j; vis[u]=1; for(int j=0;j<m;j++) dp[(u+j)%m]=min(dp[(u+j)%m],dp[u]+cst[nw][j]); } for(int i=0;i<m;i++) { if(dp[i]>INF) dp[i]=-1; cout<<dp[i]<<"\n"; } } signed main() { ios::sync_with_stdio(0); cin.tie(0); int _=1; // cin>>_; while(_--) solve(); 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 | /* Things to notice: 1. do not calculate useless values 2. do not use similar names Things to check: 1. submit the correct file 2. time (it is log^2 or log) 3. memory 4. prove your naive thoughts 5. long long 6. corner case like n=0,1,inf or n=m 7. check if there is a mistake in the ds or other tools you use 8. fileio in some oi-contest 9. module on time 10. the number of a same divisor in a math problem 11. multi-information and queries for dp and ds problems */ #include<bits/stdc++.h> using namespace std; #define int long long #define fi first #define se second #define pii pair<long long,long long> #define mp make_pair #define pb push_back const int inf=0x3f3f3f3f; const int INF=1e18; int cst[2][7005],dp[7005],vis[7005]; vector <pii > vec[7005]; int n,K,m; void solve() { cin>>n>>K>>m; while(n--) { int x,y,z; cin>>x>>y>>z; vec[x].pb(mp(y%m,z)); } int nw=0; memset(cst,0x3f,sizeof(cst)); cst[0][0]=0; for(int i=1;i<=K;i++) { nw^=1; memset(cst[nw],0x3f,sizeof(cst[nw])); for(int j=0;j<vec[i].size();j++) { int u=vec[i][j].fi,w=vec[i][j].se; for(int x=0;x<m;x++) cst[nw][(x+u)%m]=min(cst[nw][(x+u)%m],cst[nw^1][x]+w); } } memset(dp,0x3f,sizeof(dp)); dp[0]=0; for(int _=0;_<m;_++) { int u=-1; for(int j=0;j<m;j++) if(!vis[j]) if(u==-1||dp[j]<dp[u]) u=j; vis[u]=1; for(int j=0;j<m;j++) dp[(u+j)%m]=min(dp[(u+j)%m],dp[u]+cst[nw][j]); } for(int i=0;i<m;i++) { if(dp[i]>INF) dp[i]=-1; cout<<dp[i]<<"\n"; } } signed main() { ios::sync_with_stdio(0); cin.tie(0); int _=1; // cin>>_; while(_--) solve(); return 0; } |