Submission #235633

#TimeUsernameProblemLanguageResultExecution timeMemory
235633Haunted_CppSalesman (IOI09_salesman)C++17
17 / 100
102 ms4732 KiB
/** * author: Duarte Nobrega * created: 28.05.2020 **/ #include <bits/stdc++.h> using namespace std; typedef long long i64; const int N = 5e5 + 5; i64 dp [N]; tuple<int, int, int> feiras [N]; int n_feiras, descer, subir, inicio; i64 solve (int p = 0) { i64 &res = dp[p]; if (~res) return res; int where_am_i = get<1>(feiras[p]); if (where_am_i > inicio) { res = - 1LL * (where_am_i - inicio) * descer; } else { res = - 1LL * (inicio - where_am_i) * subir; } for (int i = p + 1; i < n_feiras; i++) { int final_location = get<1>(feiras[i]); int d = abs (final_location - where_am_i); if (final_location < where_am_i) { res = max (res, solve (i) - 1LL * d * descer + get<2>(feiras[i])); } else { res = max (res, solve (i) - 1LL * d * subir + get<2>(feiras[i])); } } return res; } int main () { ios::sync_with_stdio(0); cin.tie(0); cin >> n_feiras >> descer >> subir >> inicio; assert (n_feiras <= 5000); memset (dp, -1, sizeof(dp)); feiras[0] = make_tuple (0, inicio, 0); n_feiras++; for (int i = 1; i <= n_feiras; i++) { int dia, onde, lucro; cin >> dia >> onde >> lucro; feiras[i] = make_tuple(dia, onde, lucro); } sort (feiras, feiras + n_feiras, [&] ( auto primeiro, auto segundo ) { if (get<0>(primeiro) != get<0>(segundo)) { return get<0>(primeiro) < get<0>(segundo); } if (descer > subir) { return get<1>(primeiro) > get<1>(segundo); } return get<1>(primeiro) < get<1>(segundo); }); cout << solve () << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...