Submission #1096712

#TimeUsernameProblemLanguageResultExecution timeMemory
1096712vjudge1Sailing Race (CEOI12_race)C++17
60 / 100
415 ms6636 KiB
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int MAXN = 500;
vector<vector<int>> a(MAXN, vector<int>(MAXN)), aa(MAXN, vector<int>(MAXN));
vector<vector<int>> md(MAXN, vector<int>(MAXN)), mdc(MAXN, vector<int>(MAXN));
vector<vector<int>> ed(MAXN, vector<int>(MAXN)), edc(MAXN, vector<int>(MAXN));
vector<vector<bool>> adj(MAXN, vector<bool>(MAXN));
vector<int> last(MAXN), b(MAXN), bb(MAXN);
int n, kk, max_val, maxi;
void inp() {
    cin >> n >> kk;
    for (int i = 0; i < n; i++) {
        int x;
        while (cin >> x && x > 0) {
            adj[i][x-1] = true;
        }
    }
    fill(b.begin(), b.end(), 0);
    fill(bb.begin(), bb.end(), 0);
    for (int i = 0; i < n; i++) {
        int j = (i + 1) % n;
        while (i != j) {
            if (adj[i][j]) {
                b[i]++;
                a[i][b[i]] = j;
                md[i][j] = 1;
                mdc[i][j] = 1;
            }
            if (adj[j][i]) {
                bb[i]++;
                aa[i][bb[i]] = j;
            }
            j = (j + 1) % n;
        }
    }
}
void calc() {
    for (int i = 0; i < n; i++) {
        md[i][i] = mdc[i][i] = ed[i][i] = edc[i][i] = 0;
    }
    for (int t = 1; t < n; t++) {
        for (int i = 0; i < n; i++) {
            for (int j = 1; j <= b[i]; j++) {
                int y = a[i][j];
                int x = (i + t) % n;
                int h = (y + n - i) % n;
                if (h < t) {
                    if (md[y][x] > 0 && md[y][x] >= md[i][x])
                        md[i][x] = md[y][x] + 1;
                    if (ed[y][x] >= ed[i][x])
                        ed[i][x] = ed[y][x] + 1;
                    if (edc[y][i] >= ed[i][x])
                        ed[i][x] = edc[y][i] + 1;
                }
                x = (i + n - t) % n;
                h = (i + n - y) % n;
                if (h < t) {
                    if (mdc[y][x] > 0 && mdc[y][x] >= mdc[i][x])
                        mdc[i][x] = mdc[y][x] + 1;
                    if (edc[y][x] >= edc[i][x])
                        edc[i][x] = edc[y][x] + 1;
                    if (ed[y][i] >= edc[i][x])
                        edc[i][x] = ed[y][i] + 1;
                }
            }
        }
    }
    max_val = 0;
    for (int i = 0; i < n; i++) {
        if (edc[i][i] > max_val) {
            max_val = edc[i][i];
            maxi = i;
        }
        if (ed[i][i] > max_val) {
            max_val = ed[i][i];
            maxi = i;
        }
    }
}
void opt() {
    for (int i = 0; i < n; i++) {
        // case 1: i y z x 为正 positive
        for (int j = 2; j < n; j++) {
            int x = (i + j) % n;
            int k = 1;
            while (k <= bb[x] && (aa[x][k] + n - i - 1) % n > j - 1) k++;
            last[x] = (k <= bb[x]) ? aa[x][k] : -1;
        }
        for (int j = 2; j < n - 1; j++) {
            if (adj[i][(i + j) % n]) {
                int z = (i + j) % n;
                for (int k = j + 1; k < n; k++) {
                    int x = (i + k) % n;
                    if (last[x] > -1 && (n + last[x] - i) % n < j && md[x][i] > 0) {
                        int tmp = 1 + md[x][i] + 1 + max(edc[z][last[x]], ed[z][x]);
                        if (tmp > max_val) {
                            max_val = tmp;
                            maxi = last[x];
                        }
                    }
                }
            }
        }
        // case 2: i y z x 为负 negative
        for (int j = 1; j < n - 1; j++) {
            int x = (i + j) % n;
            int k = 1;
            while (k <= bb[x] && (aa[x][k] + n - i) % n > j) k++;
            last[x] = (k > 1) ? aa[x][k - 1] : -1;
        }
        for (int j = 2; j < n - 1; j++) {
            if (adj[i][(i + j) % n]) {
                int z = (i + j) % n;
                for (int k = 1; k < j; k++) {
                    int x = (i + k) % n;
                    if (last[x] > -1 && (n + last[x] - i) % n > j && mdc[x][i] > 0) {
                        int tmp = 1 + mdc[x][i] + 1 + max(ed[z][last[x]], edc[z][x]);
                        if (tmp > max_val) {
                            max_val = tmp;
                            maxi = last[x];
                        }
                    }
                }
            }
        }
    }
}
int main() {
    inp();
    calc();
    if (kk == 1) opt();
    cout << max_val << endl;
    cout << maxi + 1 << endl;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...