제출 #739389

#제출 시각아이디문제언어결과실행 시간메모리
739389Magikarp4000여행하는 상인 (APIO17_merchant)C++17
100 / 100
373 ms247420 KiB
#include <bits/stdc++.h> using namespace std; #define OPTM ios_base::sync_with_stdio(0); cin.tie(0); #define INF int(1e9+7) #define ln '\n' #define ll long long #define ull unsigned long long #define ui unsigned int #define us unsigned short #define FOR(i,s,n) for (int i = s; i < n; i++) #define FORR(i,n,s) for (int i = n; i > s; i--) #define FORX(u, arr) for (auto u : arr) #define PB push_back #define in(v,x) (v.find(x) != v.end()) #define F first #define S second #define PII pair<int, int> #define PLL pair<ll, ll> #define UM unordered_map #define US unordered_set #define PQ priority_queue #define ALL(v) v.begin(), v.end() const ll LLINF = 1e18+1; #define int long long const int MAXN = 1e2+1, MAXK = 1e3+1; int n,m,K; int b[MAXN][MAXK], s[MAXN][MAXK]; int dist[MAXN][MAXN], d[MAXN][MAXN], prof[MAXN][MAXN]; bool good[MAXN]; vector<pair<int,PII>> v[MAXN]; bool check(int val) { FOR(i,1,n+1) { FOR(j,1,n+1) { d[i][j] = LLINF; } //d[i][i] = good[i] = 0; } FOR(i,1,n+1) { FOR(j,1,n+1) { if (dist[i][j] == LLINF) continue; //if (i == j || dist[i][j] == LLINF) continue; d[i][j] = dist[i][j]*val-prof[i][j]; } } FOR(k,1,n+1) { FOR(i,1,n+1) { FOR(j,1,n+1) { if (d[i][k]+d[k][j] == 0 && i == j && j != k) good[i] = 1; d[i][j] = min(d[i][j], d[i][k]+d[k][j]); } } } // FOR(i,1,n+1) { // FOR(j,1,n+1) cout << d[i][j] << ' '; // cout << ln; // } // cout << ln; FOR(i,1,n+1) if (d[i][i] <= 0) return 1; return 0; } signed main() { OPTM; cin >> n >> m >> K; FOR(i,1,n+1) { FOR(j,1,K+1) cin >> b[i][j] >> s[i][j]; } FOR(i,1,n+1) { FOR(j,1,n+1) { dist[i][j] = LLINF; } //dist[i][i] = 0; } FOR(i,0,m) { int x,y,w; cin >> x >> y >> w; int mx = 0; FOR(j,1,K+1) v[x].PB({y,{mx,w}}); dist[x][y] = w; } FOR(k,1,n+1) { FOR(i,1,n+1) { FOR(j,1,n+1) { dist[i][j] = min(dist[i][j], dist[i][k]+dist[k][j]); } } } FOR(i,1,n+1) { FOR(j,1,n+1) { FOR(x,1,K+1) { if (dist[i][j] == LLINF) continue; if (s[j][x] != -1 && b[i][x] != -1) prof[i][j] = max(prof[i][j], s[j][x]-b[i][x]); } } } int l = 1, r = 1LL*(1e9+1); while (l < r) { int mid = (l+r)/2; if (check(mid)) l = mid+1; else r = mid; } cout << l-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...