제출 #1184489

#제출 시각아이디문제언어결과실행 시간메모리
1184489vux2codeSailing Race (CEOI12_race)C++20
0 / 100
363 ms4632 KiB
#include <bits/stdc++.h> using namespace std; static const int MAXN = 500; int N, K; vector<int> adj[MAXN]; int dp2[MAXN][MAXN][2]; // classical DP: max edges from st, using only vertices in open arc (st->en,dir) int dp1[MAXN][MAXN][2]; // one-crossing DP: max edges from st with at most one crossing of chord en->st inline bool inrange(int st, int en, int dir, int x) { if (x == st || x == en) return false; if (dir == 0) { // CCW from st to en int d_se = (en - st + N) % N; int d_sx = (x - st + N) % N; return (d_sx > 0 && d_sx < d_se); } else { // CW from st to en int d_se = (st - en + N) % N; int d_sx = (st - x + N) % N; return (d_sx > 0 && d_sx < d_se); } } // DP for k=0: longest path without crossing chord en->st int dfs2(int st, int en, int dir) { int &res = dp2[st][en][dir]; if (res != -1) return res; int best = 0; for (int nxt : adj[st]) { if (nxt == en || inrange(st, en, dir, nxt)) { best = max(best, 1 + dfs2(nxt, en, dir)); } } return res = best; } // DP for k=1: longest path with at most one crossing of chord en->st int dfs1(int st, int en, int dir) { int &res = dp1[st][en][dir]; if (res != -1) return res; // Option 1: no crossing at all int best = dfs2(st, en, dir); // Option 2: take one step for (int nxt : adj[st]) { if (nxt == en || inrange(st, en, dir, nxt)) { // still inside interior arc, crossing not used best = max(best, 1 + dfs1(nxt, en, dir)); } else { // this edge crosses chord en->st; after this, no more crossings best = max(best, 1 + dfs2(nxt, en, 1 - dir)); } } return res = best; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> N >> K; for (int i = 0; i < N; i++) { adj[i].clear(); while (true) { int x; cin >> x; if (x == 0) break; adj[i].push_back(x - 1); } } memset(dp2, -1, sizeof(dp2)); memset(dp1, -1, sizeof(dp1)); int answer = 0; int startHarbor = 1; for (int s = 0; s < N; s++) { for (int t : adj[s]) { for (int dir = 0; dir < 2; dir++) { int val; if (K == 0) { val = 1 + dfs2(t, s, 1 - dir); } else { val = 1 + dfs1(t, s, 1 - dir); } if (val > answer) { answer = val; startHarbor = s + 1; } } } } cout << answer << "\n" << startHarbor << "\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...