Submission #253164

#TimeUsernameProblemLanguageResultExecution timeMemory
253164super_j6여행하는 상인 (APIO17_merchant)C++14
12 / 100
264 ms3704 KiB
#include <iostream> #include <cstdio> #include <algorithm> #include <string.h> #include <vector> using namespace std; #define endl '\n' #define ll long long #define pi pair<ll, ll> #define f first #define s second auto cmp = [](pi x, pi y){ return x.f * y.s == x.s * y.f ? x.s > y.s : x.f * y.s < x.s * y.f;}; pi operator+(pi x, pi y){ return {x.f + y.f, x.s + y.s}; } const ll inf = 0x3f3f3f3f; const int mxn = 100, mxk = 1000; int n, m, k; ll a[mxn][mxk][2]; pi g[mxn][mxn], g2[mxn][mxn]; vector<pi> v; ll f(pi p){ return p.f / p.s; } bool sol(ll x){ for(int i = 0; i < n; i++) for(int j = 0; j < n; j++){ g2[i][j] = {0, inf}; } for(pi p : v){ if(f(g[p.f][p.s]) >= x) g2[p.f][p.s] = max(g2[p.f][p.s], g[p.f][p.s], cmp); for(int i = 0; i < n; i++){ if(g2[i][p.f].s != inf && f(g2[i][p.f] + g[p.f][p.s]) >= x) g2[i][p.s] = max(g2[i][p.s], g2[i][p.f] + g[p.f][p.s], cmp); if(g2[p.s][i].s != inf && f(g[p.f][p.s] + g2[p.s][i]) >= x) g2[p.f][i] = max(g2[p.f][i], g[p.f][p.s] + g2[p.s][i], cmp); } } ll ret = 0; for(int i = 0; i < n; i++){ if(g[0][i].s != inf && g[i][0].s != inf) ret = max(ret, f(g2[i][i])); } return ret >= x; } int main(){ ios::sync_with_stdio(0); cin.tie(0); cin >> n >> m >> k; for(int i = 0; i < n; i++) for(int j = 0; j < k; j++) for(int l = 0; l < 2; l++){ cin >> a[i][j][l]; } for(int i = 0; i < n; i++) for(int j = 0; j < n; j++){ g[i][j] = {0, inf}; v.push_back({i, j}); for(int l = 0; l < k; l++){ if(~a[i][l][0] && ~a[j][l][1]) g[i][j].f = max(g[i][j].f, a[j][l][1] - a[i][l][0]); } } for(int i = 0; i < m; i++){ ll u, v, w; cin >> u >> v >> w; u--, v--; g[u][v].s = min(g[u][v].s, w); } for(int l = 0; l < n; l++) for(int i = 0; i < n; i++) for(int j = 0; j < n; j++){ g[i][j].s = min(g[i][j].s, g[i][l].s + g[l][j].s); } /* for(int i = 0; i < n; i++) for(int j = 0; j < n; j++){ cout << g[i][j].f << " " << g[i][j].s << " | "; if(j == n - 1) cout << endl; } cout << endl; */ sort(v.begin(), v.end(), [](pi x, pi y){ return cmp(g[y.f][y.s], g[x.f][x.s]); }); int l = 0, r = inf; while(r - l > 1){ int mid = (l + r) / 2; if(sol(mid)) l = mid; else r = mid; } cout << l << endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...