Submission #200327

#TimeUsernameProblemLanguageResultExecution timeMemory
200327BTheroTravelling Merchant (APIO17_merchant)C++17
0 / 100
1090 ms2428 KiB
// Why am I so dumb? :c // chrono::system_clock::now().time_since_epoch().count() #include<bits/stdc++.h> //#include<ext/pb_ds/assoc_container.hpp> //#include<ext/pb_ds/tree_policy.hpp> #define pb push_back #define mp make_pair #define all(x) (x).begin(), (x).end() #define fi first #define se second using namespace std; //using namespace __gnu_pbds; typedef long long ll; typedef pair<int, int> pii; //template<typename T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; const int MAXN = (int)1e2 + 5; const int MAXK = (int)1e3 + 5; const ll LINF = (ll)1e17; int buy[MAXN][MAXK], sell[MAXN][MAXK]; ll dp[MAXN][MAXK]; int adj[MAXN][MAXN]; int n, m, k; bool check(int x) { for (int st = 1; st <= n; ++st) { for (int i = 1; i <= n; ++i) { for (int j = 0; j <= k; ++j) { dp[i][j] = -LINF; } } queue<pii> q; for (int to = 1; to <= n; ++to) { if (adj[st][to] == -1) { continue; } ll w = adj[st][to] * 1ll * x; dp[to][0] = -w; q.push(mp(to, 0)); for (int i = 1; i <= k; ++i) { if (buy[st][i] != -1) { dp[to][i] = -w - buy[st][i]; q.push(mp(to, i)); } } } while (!q.empty()) { int v = q.front().fi; int j = q.front().se; q.pop(); if (dp[st][0] >= 0) { return 1; } if (j == 0) { for (int i = 1; i <= k; ++i) { if (buy[v][i] != -1) { ll cur = dp[v][j] - buy[v][i]; if (cur > dp[v][i]) { dp[v][i] = cur; q.push(mp(v, i)); } } } } else { if (sell[v][j] != -1) { ll cur = dp[v][j] + sell[v][j]; if (cur > dp[v][0]) { dp[v][0] = cur; q.push(mp(v, 0)); } } } for (int to = 1; to <= n; ++to) { if (adj[v][to] != -1) { ll w = adj[v][to] * 1ll * x; if (dp[v][j] - w > dp[to][j]) { dp[to][j] = dp[v][j] - w; q.push(mp(to, j)); } } } } } return 0; } void solve() { scanf("%d %d %d", &n, &m, &k); for (int i = 1; i <= n; ++i) { for (int j = 1; j <= k; ++j) { scanf("%d %d", &buy[i][j], &sell[i][j]); } } for (int i = 1; i <= n; ++i) { for (int j = 1; j <= n; ++j) { adj[i][j] = -1; } } for (int i = 1; i <= m; ++i) { int u, v, w; scanf("%d %d %d", &u, &v, &w); adj[u][v] = w; } int l = 1, r = (int)1e9, ans = 0; while (l <= r) { int mid = (l + r) >> 1; if (check(mid)) { l = mid + 1; ans = mid; } else { r = mid - 1; } } printf("%d\n", ans); } int main() { int tt = 1; while (tt--) { solve(); } return 0; }

Compilation message (stderr)

merchant.cpp: In function 'void solve()':
merchant.cpp:111:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d %d", &n, &m, &k);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
merchant.cpp:115:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
             scanf("%d %d", &buy[i][j], &sell[i][j]);
             ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
merchant.cpp:127:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d %d", &u, &v, &w);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...