제출 #723469

#제출 시각아이디문제언어결과실행 시간메모리
723469n0sk1ll여행하는 상인 (APIO17_merchant)C++14
100 / 100
242 ms3424 KiB
#include <bits/stdc++.h> #define FAST ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);cerr.tie(0) #define mp make_pair #define xx first #define yy second #define pb push_back #define pf push_front #define popb pop_back #define popf pop_front #define all(x) x.begin(),x.end() #define ff(i,a,b) for (int i = a; i < b; i++) #define fff(i,a,b) for (int i = a; i <= b; i++) #define bff(i,a,b) for (int i = b-1; i >= a; i--) #define bfff(i,a,b) for (int i = b; i >= a; i--) using namespace std; long double typedef ld; unsigned int typedef ui; long long int typedef li; pair<int,int> typedef pii; pair<li,li> typedef pli; pair<ld,ld> typedef pld; vector<vector<int>> typedef graph; unsigned long long int typedef ull; //const int mod = 998244353; const int mod = 1000000007; //Note to self: Check for overflow int b[103][1003]; int s[103][1003]; li dist[103][103]; //shortest time li profit[103][103]; //koliko profitira od u do v (na pocetku uzima strogo shortest path) li g[103][103]; //ono cime svrsavamo zadatak int main() { FAST; int n,m,k; cin>>n>>m>>k; fff(i,1,n) fff(j,1,k) cin>>b[i][j]>>s[i][j]; fff(i,1,n) fff(j,1,n) dist[i][j]=mod; while (m--) { int u,v,w; cin>>u>>v>>w; dist[u][v]=w; } fff(pivot,1,n) { ff(i,1,pivot) ff(j,1,pivot) dist[i][j]=min(dist[i][j],dist[i][pivot]+dist[pivot][j]); ff(i,1,pivot) ff(j,1,pivot) dist[i][pivot]=min(dist[i][pivot],dist[i][j]+dist[j][pivot]); ff(i,1,pivot) ff(j,1,pivot) dist[pivot][j]=min(dist[pivot][j],dist[pivot][i]+dist[i][j]); //za svaki slucaj ponavljamo ff(i,1,pivot) ff(j,1,pivot) dist[i][j]=min(dist[i][j],dist[i][pivot]+dist[pivot][j]); ff(i,1,pivot) ff(j,1,pivot) dist[i][pivot]=min(dist[i][pivot],dist[i][j]+dist[j][pivot]); ff(i,1,pivot) ff(j,1,pivot) dist[pivot][j]=min(dist[pivot][j],dist[pivot][i]+dist[i][j]); } fff(i,1,n) dist[i][i]=0; fff(i,1,n) fff(j,1,n) if (dist[i][j]>mod-4) dist[i][j]=0; //samo ne... fff(predmet,1,k) fff(i,1,n) fff(j,1,n) if (s[j][predmet]>-1 && b[i][predmet]>-1) profit[i][j]=max(profit[i][j],(li)(s[j][predmet]-b[i][predmet])); /*fff(i,1,n) { fff(j,1,n) cout<<dist[i][j]<<" "; cout<<endl; } cout<<endl; fff(i,1,n) fff(j,1,n) { cout<<"immediate profit: ("<<i<<","<<j<<") = "<<profit[i][j]<<endl; }*/ int LL=0,RR=mod; while (RR-LL>1) { int delj=(LL+RR)/2; fff(i,1,n) fff(j,1,n) { if (dist[i][j]==0) g[i][j]=1e18; else g[i][j]=(li)delj*dist[i][j]-profit[i][j]; } /*cout<<delj<<":"<<endl; fff(i,1,n) { fff(j,1,n) cout<<g[i][j]<<" "; cout<<endl; }*/ ff(rep,0,3) fff(pivot,1,n) ff(_rep,0,2) { ff(i,1,pivot) ff(j,1,pivot) g[i][j]=min(g[i][j],g[i][pivot]+g[pivot][j]); ff(i,1,pivot) ff(j,1,pivot) g[i][pivot]=min(g[i][pivot],g[i][j]+g[j][pivot]); ff(i,1,pivot) ff(j,1,pivot) g[pivot][j]=min(g[pivot][j],g[pivot][i]+g[i][j]); } /*cout<<delj<<":"<<endl; fff(i,1,n) { fff(j,1,n) cout<<g[i][j]<<" "; cout<<endl; } cout<<endl;*/ li sta=1e18; fff(i,1,n) sta=min(sta,g[i][i]); if (sta<=0) LL=delj; else RR=delj; } cout<<LL; } //Note to self: Check for overflow /* 4 5 2 10 9 5 2 6 4 20 15 9 7 10 9 -1 -1 16 11 1 2 3 2 3 3 1 4 1 4 3 1 3 1 1 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...