Submission #552055

#TimeUsernameProblemLanguageResultExecution timeMemory
552055AlexandruabcdeSailing Race (CEOI12_race)C++14
40 / 100
158 ms2652 KiB
#include <bits/stdc++.h> using namespace std; constexpr int NMAX = 502; int N, K; vector <int> G[NMAX]; void Read () { ios_base::sync_with_stdio(false); cin.tie(nullptr); cin >> N >> K; for (int i = 1; i <= N; ++ i ) { int x; cin >> x; while (x != 0) { G[i].push_back(x); cin >> x; } } } bool Between (int val, int st, int dr) { if (st <= dr) return (st <= val && val <= dr); return (st <= val || val <= dr); } int Before (int val) { if (val > 1) return val-1; return N; } int After (int val) { if (val < N) return val + 1; return 1; } int dp[NMAX][NMAX][2]; void Precompute () { for (int i = 1; i <= N; ++ i ) for (int j = 1; j <= N; ++ j ) for (int c = 0; c < 2; ++ c ) dp[i][j][c] = 0; for (int lg = 2; lg <= N; ++ lg ) { for (int i = 1; i <= N; ++ i ) { int j = i + lg - 1; if (j > N) j -= N; dp[i][j][0] = dp[i][j][1] = 0; ///Caz I: din i for (auto vec : G[i]) { if (!Between(vec, i, j)) continue; dp[i][j][0] = max(dp[i][j][0], 1 + max(dp[After(i)][vec][1], dp[vec][j][0])); } ///Caz II: din j for (auto vec : G[j]) { if (!Between(vec, i, j)) continue; dp[i][j][1] = max(dp[i][j][1], 1 + max(dp[i][vec][1], dp[vec][Before(j)][0])); } } } } void Solve_Case_0 () { int ans = 0, start = 1; for (int i = 1; i <= N; ++ i ) { for (auto vec : G[i]) { ///i -> vec int posib = 1 + max(dp[After(i)][vec][1], dp[vec][Before(i)][0]); if (posib > ans) { ans = posib; start = i; } } } cout << ans << '\n' << start << '\n'; } int main () { Read(); Precompute(); if (K == 0) Solve_Case_0 (); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...