Submission #627330

#TimeUsernameProblemLanguageResultExecution timeMemory
627330MohamedFaresNebiliTravelling Merchant (APIO17_merchant)C++14
100 / 100
98 ms4212 KiB
#include <bits/stdc++.h>

            using namespace std;

            using ll = long long;
            using ld = long double;
            using pi = pair<pair<int, int>, pair<int, int>>;

            #define ff first
            #define ss second
            #define pb push_back
            #define all(x) (x).begin(), (x).end()
            #define lb lower_bound
            #define int ll

            int N, M, K, B[105][1005], S[105][1005];
            int D[105][105], P[105][105], DP[105][105];

            void solve(int A[105][105]) {
                for(int l = 1; l <= N; l++)
                    for(int i = 1; i <= N; i++)
                        for(int j = 1; j <= N; j++)
                            A[i][j] = min(A[i][j], A[i][l] + A[l][j]);
            }

            int32_t main() {
                ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
                cin >> N >> M >> K;
                for(int l = 1; l <= N; l++)
                    for(int i = 1; i <= N; i++)
                        D[l][i] = 1e9 + 7;
                for(int l = 1; l <= N; l++) {
                    for(int i = 1; i <= K; i++) {
                        cin >> B[l][i] >> S[l][i];
                    }
                }
                for(int l = 1; l <= M; l++) {
                    int U, V, C; cin >> U >> V >> C;
                    D[U][V] = C;
                }
                for(int l = 1; l <= N; l++) {
                    for(int i = 1; i <= N; i++) {
                        for(int j = 1; j <= K; j++) {
                            if(B[l][j] == -1 || S[i][j] == -1) continue;
                            P[l][i] = max(P[l][i], S[i][j] - B[l][j]);
                        }
                    }
                }
                solve(D);
                int lo = 1, hi = 1e9 + 7, ans = 0;
                while(lo <= hi) {
                    int md = (lo + hi) / 2;
                    for(int l = 1; l <= N; l++)
                        for(int i = 1; i <= N; i++)
                            DP[l][i] = md * D[l][i] - P[l][i];
                    solve(DP); bool ok = 0;
                    for(int l = 1; l <= N; l++)
                        ok |= (DP[l][l] <= 0);
                    if(ok) ans = md, lo = md + 1;
                    else hi = md - 1;
                }
                cout << ans << "\n";
                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...