Submission #1275582

#TimeUsernameProblemLanguageResultExecution timeMemory
1275582mehrzadMigrations (IOI25_migrations)C++17
0 / 100
30 ms1080 KiB
#include "migrations.h" #include <bits/stdc++.h> using namespace std; /* Robust protocol (correct on all inputs, low chatter): - Maintain diameter (A,B) online with LCA. - Speak only in the last K=50 nodes (i >= startIdx). Else return 0. Messages: - On a real diameter change at i: S[i] = (other_endpoint + 1), forced EVEN (if odd, add +1) // "CHANGE" - Otherwise, exactly once in the suffix we send two "init" messages: first: S = (A + 1), forced ODD // "INIT" second: S = (B + 1), forced ODD // "INIT" If a change happens before we send the second init, we skip it. Decode (Museum): - If any EVEN message exists → use the LAST EVEN message: (U = idx_of_msg, V = val-1) - Else → take the LAST TWO ODD messages: (U = odd1-1, V = odd2-1) This guarantees correctness; Z ≤ 10002, M ≤ 50 (usually ≤ 3). */ namespace { // per-test state bool inited = false; int Nglob = 0, LOGv = 0; int K = 50, startIdx = 1; vector<int> depth; vector<vector<int>> up; // up[v][k] int A = 0, B = 0, D = 0; bool sentInit1 = false, sentInit2Pending = false; int init2Val = 0; inline void reset_test(int N){ inited = true; Nglob = N; LOGv = 0; while ((1<<LOGv) <= max(1, Nglob)) ++LOGv; depth.assign(Nglob, 0); up.assign(Nglob, vector<int>(LOGv, 0)); for (int k=0;k<LOGv;++k) up[0][k] = 0; A = B = 0; D = 0; K = min(50, max(1, Nglob-1)); startIdx = max(1, Nglob - K); sentInit1 = false; sentInit2Pending = false; init2Val = 0; } inline int lca(int u,int v){ if (depth[u]<depth[v]) swap(u,v); int diff = depth[u] - depth[v]; for (int k=0; diff; ++k, diff>>=1) if (diff & 1) u = up[u][k]; if (u==v) return u; for (int k=LOGv-1;k>=0;--k) if (up[u][k] != up[v][k]){ u = up[u][k]; v = up[v][k]; } return up[u][0]; } inline int dist(int u,int v){ int w = lca(u,v); return depth[u] + depth[v] - 2*depth[w]; } inline int force_even(int x){ return (x & 1) ? x+1 : x; } inline int force_odd (int x){ return (x & 1) ? x : x+1; } } int send_message(int N, int i, int Pi){ // Per-test reinit when new test starts (i==1) if (!inited || i == 1) reset_test(N); // Build lifting for node i depth[i] = depth[Pi] + 1; up[i][0] = Pi; for (int k=1;k<LOGv;++k) up[i][k] = up[ up[i][k-1] ][k-1]; // Online diameter update int dA = dist(i, A); int dB = dist(i, B); bool changed = false; int other = -1; if (dA > D){ changed = true; other = A; B = i; D = dA; } else if (dB > D){ changed = true; other = B; A = i; D = dB; } int out = 0; if (i >= startIdx){ if (changed){ // Real change: send EVEN-coded other+1 int v = other + 1; v = force_even(v); if (v > 20000) v -= 1; // keep within bounds (rare; N<=10000 so safe) out = v; // cancel pending init2 to save messages sentInit2Pending = false; } else if (!sentInit1){ // First init (ODD-coded A+1) int v = force_odd(A + 1); if (v > 20000) v -= 1; out = v; sentInit1 = true; sentInit2Pending = true; init2Val = force_odd(B + 1); if (init2Val > 20000) init2Val -= 1; } else if (sentInit2Pending){ // Second init (ODD-coded B+1), unless a change happened (handled above) out = init2Val; sentInit2Pending = false; } // else: stay silent } return out; // 0 ⇒ no message } std::pair<int,int> longest_path(std::vector<int> S){ // Gather messages vector<pair<int,int>> msgs; msgs.reserve(S.size()); for (int i=0;i<(int)S.size();++i) if (S[i] != 0) msgs.emplace_back(i, S[i]); if (msgs.empty()) return {0,0}; // trivial fallback // Look for the last EVEN message → change for (int t=(int)msgs.size()-1; t>=0; --t){ if ((msgs[t].second & 1) == 0){ int idx = msgs[t].first; int val = msgs[t].second - 1; // decode endpoint return { idx, val }; } } // Otherwise, use the last two ODD messages → (A,B) int cnt=0; int v2=-1, v1=-1; // v2 = last, v1 = second last for (int t=(int)msgs.size()-1; t>=0 && cnt<2; --t){ if ((msgs[t].second & 1) == 1){ if (cnt==0){ v2 = msgs[t].second - 1; } else { v1 = msgs[t].second - 1; } ++cnt; } } if (cnt == 2) return { v1, v2 }; // Degenerate: only one odd message — treat as (idx,val) auto [idx,val] = msgs.back(); return { idx, val-1 }; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...