Submission #1253166

#TimeUsernameProblemLanguageResultExecution timeMemory
1253166QwertyPiMigrations (IOI25_migrations)C++20
83.69 / 100
31 ms1568 KiB
#include "migrations.h" #include <bits/stdc++.h> #define int long long #define all(a) begin(a), end(a) using namespace std; const int N = 10'000; const int LGN = 20; vector<int> G[N]; pair<int, int> dfs(int v, int pa = -1) { int ud = v, d = -1; for (int u : G[v]) { if (u == pa) continue; auto [ud2, d2] = dfs(u, v); if (d2 > d) ud = ud2, d = d2; } return {ud, d + 1}; } int encrypt(int N, int a, int b) { assert(a < b); int X = 0; for (int i = 0; i < a; i++) X += N - 1 - i; for (int i = a + 1; i < b; i++) X++; return X; } pair<int, int> decrypt(int N, int X) { int a = 0, b = 1; while (X >= N - 1 - a) X -= N - 1 - a, ++a, b = a + 1; while (X >= 1) --X, ++b; return {a, b}; } int msg[N]; vector<int> R {0}; vector<int> C {19, 7, 4}, P {12, 3, 2}; pair<int, int> diameter() { auto [u, du] = dfs(0); auto [v, d] = dfs(u); if (u > v) swap(u, v); int a = find(all(R), u) - R.begin(); int b = find(all(R), v) - R.begin(); return {a, b}; } int J1, K1; vector<vector<int>> M1 { {0, 1, 2}, {2, 3, 4}, {4, 0, 2}, {2, 4, 1}, {1, 3, 0} }; int _N; int32_t send_message(int32_t N, int32_t i, int32_t Pi) { _N = N; for (int x = 0; x < C.size(); x++) { int c = C[x], p = P[x]; if (i == N - c) { auto [a, b] = diameter(); int X = encrypt(R.size(), a, b); R = {R[a], R[b]}; for (int j = 0; j < p; j++) { msg[N - c + j] = X % 5; X /= 5; } } } if (i == N - 2) { G[i].push_back(Pi); G[Pi].push_back(i); R.push_back(i); auto [a, b] = diameter(); for (int j = 0; j < 5; j++) { for (int k = 0; k < 2; k++) { if (set<int>{a, b} == set<int>{M1[j][k], M1[j][k + 1]}) { msg[N - 2] = j; J1 = j; K1 = k; } } } } else if (i == N - 1) { G[i].push_back(Pi); G[Pi].push_back(i); R.push_back(i); auto [a, b] = diameter(); if (b == 5) { for (int k = 0; k < 3; k++) { if (M1[J1][k] == a) msg[N - 1] = 2 + k; } } else { for (int k = 0; k < 2; k++) { if (set<int>{a, b} == set<int>{M1[J1][k], M1[J1][k + 1]}) { msg[N - 1] = k; } } } } else { G[i].push_back(Pi); G[Pi].push_back(i); R.push_back(i); } return msg[i]; } pair<int32_t, int32_t> longest_path(vector<int32_t> S) { R = vector<int>{0}; int prv = 1; for (int x = 0; x < C.size(); x++) { int c = C[x], p = P[x]; while (prv < N - c) R.push_back(prv++); int X = 0; for (int i = (N - c) + p - 1; i >= (N - c); i--) { X = X * 5 + S[i]; } auto [a, b] = decrypt(R.size(), X); R = {R[a], R[b]}; } R.push_back(N - 4); R.push_back(N - 3); R.push_back(N - 2); switch (S[N - 1]) { case 0: return {R[M1[S[N - 2]][0]], R[M1[S[N - 2]][1]]}; case 1: return {R[M1[S[N - 2]][1]], R[M1[S[N - 2]][2]]}; case 2: return {R[M1[S[N - 2]][0]], N - 1}; case 3: return {R[M1[S[N - 2]][1]], N - 1}; case 4: return {R[M1[S[N - 2]][2]], N - 1}; } }

Compilation message (stderr)

migrations.cpp: In function 'std::pair<int, int> longest_path(std::vector<int>)':
migrations.cpp:140:1: warning: control reaches end of non-void function [-Wreturn-type]
  140 | }
      | ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...