#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 MAX_N = 100000;
const int MAX_K = 14;
int up[MAX_K][MAX_N], depth[MAX_N];
int lca(int u, int v) {
if (depth[u] < depth[v]) swap(u, v);
int diff = depth[u] - depth[v];
forn(i, MAX_K) if (diff >> i & 1) u = up[i][u];
if (u == v) return u;
dforn(i, MAX_K) if (up[i][u] != up[i][v]) {
u = up[i][u], v = up[i][v];
}
assert(up[0][u] == up[0][v]);
return u;
}
int dist(int u, int v) {
return depth[u] + depth[v] - 2 * depth[lca(u, v)];
}
int u = 0, v = 0;
int message;
int type = 0;
int send_message(int N, int i, int Pi) {
up[0][i] = Pi, depth[i] = depth[Pi] + 1;
forn(j, MAX_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 - 28) {
message = u, type = 1;
}
if (i == N - 14) {
message = v, type = 2;
}
if (!type) return 0;
int bit = message & 1;
message /= 2;
if (type == state) return 4;
if (state != 0) return bit + 2;
return bit;
}
ii longest_path(vi S) {
const int N = sz(S);
int U = 0, V = 0;
dforsn(i, N - 28, N - 14) U = (U << 1) + (S[i] % 2);
dforsn(i, N - 14, N) V = (V << 1) + (S[i] % 2);
forsn(i, N - 28, N - 14) {
if (S[i] == 4) U = i;
else if (S[i] >= 2) V = i;
}
forsn(i, N - 14, N) {
if (S[i] == 4) V = i;
else if (S[i] >= 2) U = i;
}
return {U, V};
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |