Submission #668715

#TimeUsernameProblemLanguageResultExecution timeMemory
668715finn__Sailing Race (CEOI12_race)C++17
40 / 100
895 ms6560 KiB
#include <bits/stdc++.h> using namespace std; size_t n; vector<vector<bool>> g; vector<vector<unsigned>> c, cc, longest; unsigned max_length = 0, start = -1; void longest_route() { for (size_t i = 0; i < n; i++) { for (size_t j = i + 1; j < i + n; j++) { if (longest[i][j]) { unsigned a = -1; for (size_t k = j + 1; k > j || k < i; k++) { if (g[k][i]) { a = k; break; } } if (a == UINT_MAX) continue; for (size_t k = a + 1; k > a || k < i; k++) { if (g[j][k]) { unsigned l = 2 + longest[i][j] + max(cc[k][i], c[k][a]); if (l > max_length) { max_length = l; start = a; } } } } } } } int main() { size_t k; cin >> n >> k; g = vector<vector<bool>>(n, vector<bool>(n, 0)); for (size_t i = 0; i < n; i++) { unsigned v; cin >> v; while (v) { g[i][v - 1] = 1; cin >> v; } } c = vector<vector<unsigned>>(n, vector<unsigned>(n, 0)); cc = vector<vector<unsigned>>(n, vector<unsigned>(n, 0)); for (size_t l = 2; l < n; l++) { for (size_t i = 0; i < n; i++) { size_t const j = (i + l) % n; for (size_t k = i + 1; k < i + l; k++) { if (g[i][k % n]) cc[i][j] = max(cc[i][j], max(cc[k % n][j], c[k % n][i]) + 1); if (g[j][k % n]) c[j][i] = max(c[j][i], max(cc[k % n][j], c[k % n][i]) + 1); if (g[j][i] && cc[i][j] + 1 > max_length) { max_length = cc[i][j] + 1; start = j + 1; } if (g[i][j] && c[j][i] + 1 > max_length) { max_length = c[j][i] + 1; start = i + 1; } } } } if (k == 0) { cout << max_length << '\n' << start << '\n'; return 0; } longest = vector<vector<unsigned>>(n, vector<unsigned>(n, 0)); for (size_t l = 1; l < n; l++) { for (size_t i = 0; i < n; i++) { size_t const j = (i + l) % n; if (g[i][j]) longest[i][j] = 1; for (size_t k = i + 1; k < i + l; k++) { if (longest[i][k % n] && longest[k % n][j]) longest[i][j] = max(longest[i][j], longest[i][k % n] + longest[k % n][j]); } } } longest_route(); vector<bool> &y = g.back(); for (size_t i = 0; i < n; i++) swap(y, g[i]); longest_route(); cout << max_length << '\n' << start << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...