Submission #1257840

#TimeUsernameProblemLanguageResultExecution timeMemory
1257840biankMigrations (IOI25_migrations)C++20
83.69 / 100
32 ms1036 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, K = 15; const int A = 3, 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)]; } int u, v; int send_message(int /*N*/, int i, int Pi) { if (i == 1) { depth[0] = 0; forn(j, K) up[j][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, u) > dist(u, v)) v = i, state = 2; else if (dist(i, v) > dist(u, v)) u = i, state = 1; if (i < N - 2 * B - A) return 0; if (i >= N - A) { int diff = max(u - (N - A - B) + 1, 0); if (state == 1) return 4; return 2 * (state == 2) + (diff >> (i - (N - A)) & 1); } if (i >= N - A - B) { if (state == 2) return 4; return v >> (2 * (i - (N - B - A))) & 3; } if (state == 1) return 4; return u >> (2 * (i - (N - 2 * B - A))) & 3; } ii longest_path(vi S) { int U = 0, V = 0; int lastU = -1, lastV = -1; forsn(i, N - 2 * B - A, N - B - A) { if (S[i] == 4) lastU = i; else U += S[i] << (2 * (i - (N - 2 * B - A))); } forsn(i, N - B - A, N - A) { if (S[i] == 4) lastV = i; else V += S[i] << (2 * (i - (N - B - A))); } if (lastU != -1) U = lastU; if (lastV != -1) V = lastV; int diff = 0; lastU = -1; forsn(i, N - A, N) { if (S[i] == 4) lastU = i; else { if (S[i] >= 2) lastV = i; diff += (S[i] & 1) << (i - (N - A)); } } if (lastU != -1) U = lastU; else if (diff != 0) U = diff - 1 + (N - A - B); 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...