Submission #1184493

#TimeUsernameProblemLanguageResultExecution timeMemory
1184493vux2codeSailing Race (CEOI12_race)C++20
Compilation error
0 ms0 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;
    // base case: no moves when start equals end
    if (st == en) return res = 0;
    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;
}

Compilation message (stderr)

race.cpp: In function 'int dfs1(int, int, int)':
race.cpp:44:10: error: redeclaration of 'int& res'
   44 |     int &res = dp1[st][en][dir];
      |          ^~~
race.cpp:40:10: note: 'int& res' previously declared here
   40 |     int &res = dp1[st][en][dir];
      |          ^~~