Submission #1184564

#TimeUsernameProblemLanguageResultExecution timeMemory
1184564vux2codeSailing Race (CEOI12_race)C++20
0 / 100
3095 ms8776 KiB
// Src : Vux2Code
/* Note :
    https://oj.uz/problem/view/CEOI12_race
    iamstillstupid
*/

#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, f1 [maxN] [maxN] [2], f2 [maxN] [maxN] [2];
vector <ll> adj [maxN];

ll nx (ll x) {
    x ++;
    if (x > n) x -= n;
    return x;
}

bool irg (ll st, ll en, ll x) {
    if (st == en || en == nx (st)) return 0;
    if (st > en) return x > st || x < en;
    return st < x && x < en;
}

bool inrange (ll st, ll en, bool dir, ll x) {
    if (dir) return irg (st, en, x);
    return irg (en, st, x);
}

ll fin2d (ll st, ll en, bool dir) {
    if (f1 [st] [en] [dir] != -1) return f1 [st] [en] [dir];
    f1 [st] [en] [dir] = 0;
    for (ll i : adj [st]) if (inrange (st, en, dir, i)) {
        // cerr << st << ' ' << en << ' ' << dir << ' ' << i << '\n';
        maxi (f1 [st] [en] [dir], 1ll + max (fin2d (i, en, dir), fin2d (i, st, !dir)));
    }
    // cerr << st << ' ' << en << ' ' << dir << ' ' << f1 [st] [en] [dir] << '\n';
    return f1 [st] [en] [dir];
}

ll finz (ll st, ll en, bool dir) {
    // cerr << st << ' ' << en << ' ' << dir << '\n';
    if (f2 [st] [en] [dir] != -1) return f2 [st] [en] [dir];
    if (st == en) return f2 [st] [en] [dir] = 1;
    f2 [st] [en] [dir] = -inf64;
    for (ll i : adj [st]) if (inrange (st, en, dir, i) || i == en) maxi (f2 [st] [en] [dir], finz (i, en, dir) + 1);
    return f2 [st] [en] [dir];
}

ll fin1d (ll st, ll en, bool dir) {
    ll ans = 0;
    for (int i = 1; i <= n; i ++) if (inrange (st, en, dir, i)) {
        if (finz (st, i, dir) > 0) {
            for (ll j : adj [i]) {
                if (inrange (st, en, dir, j)) continue;
                maxi (ans, finz (st, i, dir) + fin2d (j, st, dir));
                maxi (ans, finz (st, i, dir) + fin2d (j, en, !dir));
                // cerr << st << ' ' << en << ' ' << dir << ' ' << j << ' ' << finz (st, i, dir) << ' ' << fin2d (j, st, dir) << ' ' << fin2d (j, en, !dir) << '\n';
            }
        }
    }
    return ans;
}
    

void solve () {
    cin >> n >> k;
    memset (f1, -1, sizeof f1);
    memset (f2, -1, sizeof f2);
    for (int i = 1, x; i <= n; i ++) {
        while (cin >> x && x > 0) adj [i]. pusb (x);
    }
    pll ans = {1, 1};
    // cerr << "Cin\n";
    for (int i = 1; i <= n; i ++) {
        // i = 5;
        for (ll j : adj [i]) {
            if (k) {
                if (ans. fi < 2 + fin1d (j, i, 0)) ans = {2 + fin1d (j, i, 0), i};
                if (ans. fi < 2 + fin1d (j, i, 1)) ans = {2 + fin1d (j, i, 1), i};
            }
            else {
                if (ans. fi < 2 + fin2d (j, i, 0)) ans = {2 + fin2d (j, i, 0), i};
                if (ans. fi < 2 + fin2d (j, i, 1)) ans = {2 + fin2d (j, i, 1), i};
            }
        }
        // break;
    }
    // cerr << fin2d (4, 5, 0);
    // for (int i = 1; i <= n; i ++) {
    //     for (ll j : adj [i]) {
    //         cerr << i << ' ' << j << ' ' << fin2d (j, i, 0) << '\n';
    //         cerr << i << ' ' << j << ' ' << fin2d (j, i, 1) << '\n';
    //     }
    // }
    // for (int i = 1; i <= n; i ++) {
    //     for (int j = 1; j <= n; j ++) {
    //         cerr << i << ' ' << j << '\n'; finz (i, j, 0); finz (i, j, 1);
    //         // cerr << i << ' ' << j << ' ' << finz (i, j, 0) << ' ' << finz (i, j, 1) << '\n';
    //     }
    // }
    // cerr << "Cout\n";
    cout << ans. fi << '\n' << ans. se << '\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...