Submission #1106831

#TimeUsernameProblemLanguageResultExecution timeMemory
1106831Zero_OPSailing Race (CEOI12_race)C++14
10 / 100
652 ms14172 KiB
#include <bits/stdc++.h> using namespace std; template<typename T> bool maximize(T& a, const T& b){ if(a < b){ return a = b, true; } return false; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); #ifdef LOCAL freopen("task.inp", "r", stdin); freopen("task.out", "w", stdout); #endif // LOCAL int N, K; cin >> N >> K; vector<vector<bool>> edges(N, vector<bool>(N, false)); for(int i = 0; i < N; ++i){ int j; while(cin >> j){ if(!j) break; --j; edges[i][j] = true; } } const int inf = 1e6; vector<vector<vector<int>>> dp(N, vector<vector<int>>(N, vector<int>(2, -inf))); //maximum paths without self-intersection for range [l, r] and counterclockwise or clockwise for(int i = 0; i < N; ++i){ dp[i][i][0] = dp[i][i][1] = 0; } for(int i = 0; i < N; ++i){ for(int j = 0; j < N; ++j){ if(edges[i][j]) dp[i][j][0] = 1; if(edges[j][i]) dp[i][j][1] = 1; } } auto next = [&](int pos){ return (pos == N - 1 ? 0 : pos + 1); }; auto prev = [&](int pos){ return (pos == 0 ? N - 1 : pos - 1); }; auto solve = [&](int l, int r, int pos){ if(!pos){ for(int x = next(l);; x = next(x)){ maximize(dp[l][r][pos], dp[l][x][pos] + dp[x][r][pos]); if(x == r) return; } } else{ for(int x = prev(r);; x = prev(x)){ maximize(dp[l][r][pos], dp[x][r][pos] + dp[l][x][pos]); if(x == l) return; } } }; for(int len = 1; len < N; ++len){ for(int l = 0; l < N; ++l){ int r_next = (l + len) % N; int r_prev = ((l - len) % N + N) % N; solve(l, r_next, 0); solve(l, r_next, 1); solve(l, r_prev, 0); solve(l, r_prev, 1); } } ///caes no self-intersection int answer = 0, start = 0; for(int i = 0; i < N; ++i){ for(int j = 0; j < N; ++j){ if(maximize(answer, dp[i][j][0])) start = i; if(maximize(answer, dp[i][j][1])) start = j; } } if(!K){ cout << answer << '\n'; cout << start + 1 << '\n'; return 0; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...