Submission #1257777

#TimeUsernameProblemLanguageResultExecution timeMemory
1257777biankMigrations (IOI25_migrations)C++20
80.17 / 100
34 ms2132 KiB
#include "migrations.h"
#include <bits/stdc++.h>

using namespace std;

#define forsn(i, s, n) for (int i = int(s); i < int(n); i++)
#define forn(i, n) forsn(i, 0, n)
#define dforsn(i, s, n) for (int i = int(n) - 1; i >= int(s); i--)
#define dforn(i, n) dforsn(i, 0, n)

using vi = vector<int>;
using ll = long long;
using ii = pair<int, int>;

#define fst first
#define snd second

#define sz(x) int(x.size())
#define all(x) begin(x), end(x)

#define pb push_back
#define eb emplace_back

const int N = 10000;
const int K = 15;
const int B = 7;

int up[K][N], depth[N];

int lca(int u, int v) {
    if (depth[u] < depth[v]) swap(u, v);
    int diff = depth[u] - depth[v];
    forn(i, K) if (diff >> i & 1) u = up[i][u];
    if (u == v) return u;
    dforn(i, K) if (up[i][u] != up[i][v]) {
        u = up[i][u], v = up[i][v];
    }
    assert(up[0][u] == up[0][v]);
    return up[0][u];
}

int dist(int u, int v) {
    return depth[u] + depth[v] - 2 * depth[lca(u, v)];
}

vi perm[N], invPerm[N];

void generate_perms() {
    srand(2006);
    vi p(5);
    iota(all(p), 0);
    forn(i, N) {
        random_shuffle(all(p));
        perm[i] = p;
        vi inv_p(5);
        forn(j, 5) inv_p[p[j]] = j;
        invPerm[i] = inv_p;
    }
}

int u, v;

int send_message(int /*N*/, int i, int Pi) {
    if (i == 1) {
        generate_perms();
        depth[0] = 0;
        forn(i, K) up[i][0] = 0; 
        u = 0, v = 0;
    }
    up[0][i] = Pi, depth[i] = depth[Pi] + 1;
    forn(j, K - 1) up[j + 1][i] = up[j][up[j][i]];
    int state = 0;
    if (dist(i, v) > dist(u, v)) u = i, state = 1;
    else if (dist(i, u) > dist(u, v)) v = i, state = 2;
    if (i < N - 3 * B) return 0;
    if (i >= N - 2 * B) {
        if (state == 2) return perm[i][4];
        int digit = v >> (i - (N - 2 * B)) & 1;
        return perm[i][2 * state + digit];
    }
    if (state == 1) return perm[i][4];
    return perm[i][u >> (2 * (i - (N - 3 * B))) & 3];
}

ii longest_path(vi S) {
    generate_perms();
    int U = 0, V = 0;
    int lastU = -1, lastV = -1;
    forsn(i, N - 3 * B, N - 2 * B) {
        int x = invPerm[i][S[i]];
        if (x == 4) lastU = i;
        else U += x << (2 * (i - (N - 3 * B)));
    }
    forsn(i, N - 2 * B, N) {
        int x = invPerm[i][S[i]];
        if (x == 4) lastV = i;
        else {
            if (x >= 2) lastU = i;
            V += (x & 1) << (i - (N - 2 * B));
        }
    }
    if (lastU != -1) U = lastU;
    if (lastV != -1) V = lastV;
    return {U, V};
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...