답안 #55259

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
55259 2018-07-06T18:34:21 Z paulica Sailing Race (CEOI12_race) C++14
85 / 100
3000 ms 4980 KB
#include <bits/stdc++.h>
using namespace std;

#define _ << " _ " <<
#define TRACE(x) cout << #x << " = " << x << endl

const int MaxN = 510;
int n, m;
int sol, start;

bool con[MaxN][MaxN];

int /*memoA[MaxN][MaxN][2],*/ memoB[MaxN][MaxN][2];
int dpA[MaxN][MaxN][2];

int nxt(int i, int d) {
    if (d == 1) return i == n - 1 ? 0 : i + 1;
    else return i == 0 ? n - 1 : i - 1;
}

/*
int dpA(int i, int j, int d) {
    int& dp = memoA[i][j][d];
    if (dp != -1) return dp;
    
    if (i == j) dp = 1;
    else if (con[i][j]) dp = 2;
    else dp = 0;

    for (int k = i; k != j; k = nxt(k, d))
        if (con[k][j] && dpA(i, k, d) > 0) dp = max(dp, dpA(i, k, d) + 1);

    return dp;
}
*/

int dpB(int i, int j, int d) {
    int& dp = memoB[i][j][d];
    if (dp != -1) return dp;

    dp = (i != j);

    for (int k = i; k != j; k = nxt(k, d))
        if (con[i][k]) {
            dp = max(dp, dpB(k, j, d) + 1);
            dp = max(dp, dpB(k, i, 1 - d) + 1);
        }

    return dp;
}

void check(int cnt, int s) {
    if (cnt > sol) {
        sol = cnt;
        start = s;
    }
}

void solveS(int x, int s, int d) {
    int maxB = 0, t = -1;

    for (int i = nxt(s, d); i != x; i = nxt(i, d)) {
        if (con[s][i]) {
            t = i;
            check(dpA[t][x][d] + maxB, s);
        }

        if (con[x][i])
            maxB = max(maxB, dpB(i, s, 1 - d));
    }
}

void solveT(int x, int t, int d) {
    int maxB = 0, s = -1;
    
    for (int i = nxt(x, d); i != t; i = nxt(i, d))
        if (con[i][t]) {
            s = i;
            break;
        }

    if (s == -1) return;

    for (int i = nxt(s, d); i != t; i = nxt(i, d))
        if (con[x][i])
            maxB = max(maxB, dpB(i, t, d));

    check(dpA[t][x][d] + maxB, s);
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    cin >> n >> m;

    for (int i = 0; i < n; i++) {
        int j;
        for (cin >> j; j != 0; cin >> j)
            con[i][j - 1] = true;

        for (int j = 0; j < n; j++)
            for (int d : {0, 1})
                /*memoA[i][j][d] = */memoB[i][j][d] = -1;
    }

    for (int d : {0, 1})
        for (int i = 0; i < n; i++) {
            dpA[i][i][d] = 1;

            for (int j = nxt(i, d); j != i; j = nxt(j, d)) {
                int& dp = dpA[i][j][d];

                if (con[i][j]) dp = 2;
                else dp = 0;

                for (int k = nxt(i, d); k != j; k = nxt(k, d))
                    if (con[k][j] && dpA[i][k][d] > 0) dp = max(dp, dpA[i][k][d] + 1);
            }
        }

    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            for (int d : {0, 1})
                if (con[i][j]) check(dpB(j, i, d), i);

    if (m == 1)
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                if (i != j) {
                    solveS(i, j, 0);
                    solveS(i, j, 1);
                    solveT(i, j, 0);
                    solveT(i, j, 1);
                }

    cout << sol << "\n" << start + 1 << "\n";

    return 0;
}

# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 488 KB Output is correct
3 Correct 3 ms 796 KB Output is correct
4 Correct 5 ms 796 KB Output is correct
5 Correct 5 ms 872 KB Output is correct
6 Correct 9 ms 1032 KB Output is correct
7 Correct 11 ms 1208 KB Output is correct
8 Correct 18 ms 1284 KB Output is correct
9 Correct 18 ms 1356 KB Output is correct
10 Correct 22 ms 1356 KB Output is correct
11 Correct 23 ms 1356 KB Output is correct
12 Correct 215 ms 2304 KB Output is correct
13 Correct 555 ms 3148 KB Output is correct
14 Correct 463 ms 4036 KB Output is correct
15 Correct 2865 ms 4980 KB Output is correct
16 Execution timed out 3051 ms 4980 KB Time limit exceeded
17 Correct 2572 ms 4980 KB Output is correct
18 Correct 813 ms 4980 KB Output is correct
19 Execution timed out 3063 ms 4980 KB Time limit exceeded
20 Execution timed out 3057 ms 4980 KB Time limit exceeded