Submission #1185305

#TimeUsernameProblemLanguageResultExecution timeMemory
1185305vux2codeSailing Race (CEOI12_race)C++20
100 / 100
871 ms12568 KiB
// Src : Vux2Code
/* Note :
    Iamstupid
*/

#include <bits/stdc++.h>
#define fi first
#define se second
#define pusb push_back
#define popb pop_back
#define pusf push_front
#define popf pop_front

using namespace std;

// template <typename T> void vout(T s){ cout << s << endl; exit(0);}

typedef long long ll;
typedef long double ld;
typedef pair <ll, ll> pll;

const ll maxN = 5e2 + 5, maxLog = 20, inf64 = 1e18, inf32 = 1e9, mod = 1e9 + 7;

void maxi (ll &x, ll y) {x = max (x, y);}
void mini (ll &x, ll y) {x = min (x, y);}

/* ---------HASHING-------- */
// const base = 31, mod2 = 1e9 + 9;

/* ---------BITMASK-------- */
// ll count (ll x) {return __builtin_popcountll (x);}
// ll fst (ll x) {return 63 - __builtin_clzll (x);}
// ll last (ll x) {return __builtin_ctzll (x);}
// bool bit (ll x, ll y) {return ((x >> y) & 1);}

ll t = 1;

ll n, k, nx [maxN] [2], dp [maxN] [maxN] [2], dp0 [maxN] [maxN] [2], dp1 [maxN] [maxN] [2], tmp, tmp2, n1, n2;
bool adj [maxN] [maxN];

void fin (ll st, ll en, bool dir) {
    if (adj [st] [en]) {
        dp0 [st] [en] [dir] = 1;
        dp1 [st] [en] [dir] = 1 + dp [en] [nx [st] [dir]] [!dir];
    }
    else {
        dp0 [st] [en] [dir] = -n;
        dp1 [st] [en] [dir] = -n;
    }
    tmp = nx [st] [dir];
    while (tmp != en) {
        maxi (dp0 [st] [en] [dir], dp0 [st] [tmp] [dir] + dp0 [tmp] [en] [dir]);
        maxi (dp1 [st] [en] [dir], dp0 [st] [tmp] [dir] + dp1 [tmp] [en] [dir]);
        tmp = nx [tmp] [dir];
    }
    dp [st] [en] [dir] = max (dp1 [st] [en] [dir], dp [st] [nx [en] [!dir]] [dir]);
}

void solve () {
    pll ans = {0, 0};
    cin >> n >> k;
    for (int i = 0, x; i < n; i ++) {
        while (cin >> x && x > 0) adj [i] [x - 1] = 1; 
    }
    for (int i = 0; i < n; i ++) {
        nx [i] [0] = (i - 1 + n) % n;
        nx [i] [1] = (i + 1) % n;
    }
    for (int len = 1; len < n; len ++) {
        for (int i = 0, j; i < n; i ++) {
            j = (i + len) % n;
            fin (i, j, 1);
            fin (j, i, 0);
        }
    }
    for (int i = 0; i < n; i ++) {
        for (int j = 0; j < n; j ++) {
            for (int dir = 0; dir <= 1; dir ++) {
                if (ans. fi < dp1 [i] [j] [dir]) ans = {dp [i] [j] [dir], i};
            }
        }
    }
    if (k) {
        for (int i = 0; i < n; i ++) {
            for (int j = 0; j < n; j ++) {
                for (int dir = 0; dir <= 1; dir ++) {
                    tmp = dp0 [i] [j] [dir];
                    if (tmp <= 0) continue;
                    n1 = nx [j] [dir];
                    while (n1 != i && !adj [n1] [i]) n1 = nx [n1] [dir];
                    if (n1 == i) continue;
                    for (n2 = nx [n1] [dir]; n2 != i; n2 = nx [n2] [dir]) {
                        if (adj [j] [n2]) {
                            tmp2 = max (dp [n2] [nx [n1] [dir]] [!dir],
                                        dp [n2] [nx [i] [!dir]] [dir]);
                            if (ans. fi < 2 + tmp + tmp2) {
                                ans = {2 + tmp + tmp2, n1};
                            }
                        }
                    }
                }
            }
        }
    }
    cout << ans. fi << '\n' << ans. se + 1 << '\n';
}

int main () {
    ios::sync_with_stdio (0);
    cin.tie (0);
    cout.tie (0);
    // #define TASK "E:/Code/CP/task"
    // if (fopen (TASK".inp", "r")) {
    //     freopen (TASK".inp", "r", stdin);
    //     freopen (TASK".out", "w", stdout);
    // }
    //cin >> t;
    while (t--) solve ();
}
#Verdict Execution timeMemoryGrader output
Fetching results...