Submission #1274809

#TimeUsernameProblemLanguageResultExecution timeMemory
1274809mehrzadMigrations (IOI25_migrations)C++17
Compilation error
0 ms0 KiB
#include "migrations.h" #include <bits/stdc++.h> using namespace std; static bool initialized = false; static int N_global = 0; static const int LOGV = 15; // 2^14 = 16384 > 10000 static vector<int> parentArr; static vector<int> depthArr; static vector<array<int, LOGV>> upArr; static int endA = 0, endB = 0, curDist = 0; // current diameter endpoints and length static int repl_Nminus2 = -1; // replacement code for node N-2 (0/1/2) static int lca(int u, int v) { if (depthArr[u] < depthArr[v]) swap(u, v); int diff = depthArr[u] - depthArr[v]; for (int k = 0; diff; ++k) { if (diff & 1) u = upArr[u][k]; diff >>= 1; } if (u == v) return u; for (int k = LOGV - 1; k >= 0; --k) { if (upArr[u][k] != upArr[v][k]) { u = upArr[u][k]; v = upArr[v][k]; } } return upArr[u][0]; } static int dist(int u, int v) { int w = lca(u, v); return depthArr[u] + depthArr[v] - 2 * depthArr[w]; } /* return code of what happened when node x is added: 0 – no change, 1 – endpoint A is replaced by x, 2 – endpoint B is replaced by x */ static int update_diameter(int x) { int da = dist(x, endA); int db = dist(x, endB); if (da > curDist) { endB = x; curDist = da; return 2; } else if (db > curDist) { endA = x; curDist = db; return 1; } return 0; } int send_message(int N, int i, int Pi) { if (!initialized) { N_global = N; parentArr.assign(N, -1); depthArr.assign(N, 0); upArr.assign(N, array<int, LOGV>{}); for (int k = 0; k < LOGV; ++k) upArr[0][k] = 0; // root endA = endB = 0; curDist = 0; repl_Nminus2 = -1; initialized = true; } // add node i parentArr[i] = Pi; depthArr[i] = depthArr[Pi] + 1; upArr[i][0] = Pi; for (int k = 1; k < LOGV; ++k) upArr[i][k] = upArr[ upArr[i][k - 1] ][k - 1]; // handle tiny N specially if (N_global == 2) { update_diameter(i); return 0; } if (N_global == 3) { if (i == 1) { update_diameter(i); return 0; } else { // i == 2, last node update_diameter(i); int a = endA, b = endB; if (a > b) swap(a, b); int code = a * N_global + b + 1; // fits into [1,9] for N=3 return code; } } // general case N >= 4 if (i == N_global - 3) { // after processing this node, send endpoint A update_diameter(i); return endA + 1; } if (i == N_global - 2) { // store current endpoint B before possible change int storedB = endB; repl_Nminus2 = update_diameter(i); return storedB + 1; } if (i == N_global - 1) { int repl_last = update_diameter(i); int code = repl_Nminus2 * 3 + repl_last; // 0..8 return code + 1; // 1..9 } // all other nodes update_diameter(i); return 0; } std::pair<int, int> longest_path(std::vector<int> S) { int N = (int)S.size(); if (N == 2) return {0, 1}; if (N == 3) { int code = -1; for (int i = 0; i < N; ++i) if (S[i] != 0) { code = S[i] - 1; break; } int a = code / N; int b = code % N; return {a, b}; } // N >= 4 int a = S[N - 3] - 1; int b = S[N - 2] - 1; int code = S[N - 1] - 1; int r2 = code / 3; int r3 = code % 3; if (r2 == 1) a = N - 2; else if (r2 == 2) b = N - 2; if (r3 == 1) a = N - 1; else if (r3 == 2) b = N - 1; return {a, b}; } " "#include "migrations.h" #include <bits/stdc++.h> using namespace std; /* ---------- global data kept between calls of send_message ---------- */ static int curN = -1; // current N static int LOGN = 0; // number of binary‑lifting levels static vector<array<int,15>> up; // up[v][k] = 2^k ancestor static vector<int> depth; // depth from the root static int curA = 0, curB = 0, curLen = 0; // current diameter endpoints static int savedA = -1, savedB = -1; // endpoints after processing N-3 /* ---------- LCA utilities ---------- */ static int lca(int u, int v) { if (u == -1 || v == -1) return -1; if (depth[u] < depth[v]) swap(u, v); int diff = depth[u] - depth[v]; for (int k = 0; diff; ++k) { if (diff & 1) u = up[u][k]; diff >>= 1; } if (u == v) return u; for (int k = LOGN - 1; k >= 0; --k) { if (up[u][k] != up[v][k]) { u = up[u][k]; v = up[v][k]; } } return up[u][0]; } static inline int dist(int u, int v) { int w = lca(u, v); return depth[u] + depth[v] - 2 * depth[w]; } /* ---------- the research team ---------- */ int send_message(int N, int i, int Pi) { /* (re)initialisation for a new test case */ if (curN != N) { curN = N; LOGN = 0; while ((1 << LOGN) <= N) ++LOGN; // enough for N ≤ 10000 up.assign(N, array<int,15>()); depth.assign(N, 0); for (int v = 0; v < N; ++v) for (int k = 0; k < LOGN; ++k) up[v][k] = -1; curA = curB = 0; curLen = 0; savedA = savedB = -1; } /* set depth and binary lifting table for the new vertex i */ depth[i] = depth[Pi] + 1; up[i][0] = Pi; for (int k = 1; k < LOGN; ++k) { int mid = up[i][k - 1]; up[i][k] = (mid == -1) ? -1 : up[mid][k - 1]; } /* update current diameter */ int dA = dist(i, curA); int dB = dist(i, curB); if (dA > curLen) { curB = i; curLen = dA; } else if (dB > curLen) { curA = i; curLen = dB; } /* ----- send the three messages ----- */ if (N >= 4 && i == N - 3) { // first old endpoint savedA = curA; savedB = curB; return savedA + 1; // 1 … 20000 } if (N >= 4 && i == N - 2) { // second old endpoint return savedB + 1; // 1 … 20000 } if (N >= 4 && i == N - 1) { // final flag int finalA = curA; int finalB = curB; auto same_pair = [&](int x, int y, int u, int v) { return (x == u && y == v) || (x == v && y == u); }; int flag; if (same_pair(finalA, finalB, savedA, savedB)) { flag = 5; // unchanged } else if (finalA == N - 1 && (finalB == savedA || finalB == savedB)) { flag = (finalB == savedA) ? 1 : 2; } else if (finalB == N - 1 && (finalA == savedA || finalA == savedB)) { flag = (finalA == savedA) ? 1 : 2; } else if (finalA == N - 2 && (finalB == savedA || finalB == savedB)) { flag = (finalB == savedA) ? 3 : 4; } else if (finalB == N - 2 && (finalA == savedA || finalA == savedB)) { flag = (finalA == savedA) ? 3 : 4; } else if (same_pair(finalA, finalB, N - 2, N - 1)) { flag = 6; // (N-2 , N-1) } else { flag = 5; // should never happen } return flag; // 1 … 6 } return 0; // no message } /* ---------- the museum ---------- */ pair<int, int> longest_path(std::vector<int> S) { int N = (int)S.size(); if (N < 4) { // not required for the official sub‑task if (N == 2) return {0, 1}; return {0, 0}; } int a = S[N - 3] - 1; // first old endpoint int b = S[N - 2] - 1; // second old endpoint int flag = S[N - 1]; switch (flag) { case 5: return {a, b}; // unchanged case 1: return {a, N - 1}; case 2: return {b, N - 1}; case 3: return {a, N - 2}; case 4: return {b, N - 2}; case 6: return {N - 2, N - 1}; default: // never reached return {a, b}; } } "

Compilation message (stderr)

migrations.cpp:137:1: warning: missing terminating " character
  137 | "
      | ^
migrations.cpp:137:1: error: missing terminating " character
migrations.cpp:138:24: warning: missing terminating " character
  138 | "#include "migrations.h"
      |                        ^
migrations.cpp:138:24: error: missing terminating " character
migrations.cpp:271:1: warning: missing terminating " character
  271 | "
      | ^
migrations.cpp:271:1: error: missing terminating " character
migrations.cpp:138:1: error: expected unqualified-id before user-defined string literal
  138 | "#include "migrations.h"
      | ^~~~~~~~~~~~~~~~~~~~~
migrations.cpp:152:12: error: redefinition of 'int lca(int, int)'
  152 | static int lca(int u, int v) {
      |            ^~~
migrations.cpp:15:12: note: 'int lca(int, int)' previously defined here
   15 | static int lca(int u, int v) {
      |            ^~~
migrations.cpp:169:19: error: redefinition of 'int dist(int, int)'
  169 | static inline int dist(int u, int v) {
      |                   ^~~~
migrations.cpp:31:12: note: 'int dist(int, int)' previously defined here
   31 | static int dist(int u, int v) {
      |            ^~~~
migrations.cpp:175:5: error: redefinition of 'int send_message(int, int, int)'
  175 | int send_message(int N, int i, int Pi) {
      |     ^~~~~~~~~~~~
migrations.cpp:55:5: note: 'int send_message(int, int, int)' previously defined here
   55 | int send_message(int N, int i, int Pi) {
      |     ^~~~~~~~~~~~
migrations.cpp:248:16: error: redefinition of 'std::pair<int, int> longest_path(std::vector<int>)'
  248 | pair<int, int> longest_path(std::vector<int> S) {
      |                ^~~~~~~~~~~~
migrations.cpp:115:21: note: 'std::pair<int, int> longest_path(std::vector<int>)' previously defined here
  115 | std::pair<int, int> longest_path(std::vector<int> S) {
      |                     ^~~~~~~~~~~~