#include "Joi.h"
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (int)(n); ++i)
#define rep2(i, a, b) for (int i = (int)(a); i < (int)(b); ++i)
#define rrep(i, n) for (int i = (int)(n) - 1; i >= 0; --i)
#define rrep2(i, a, b) for (int i = (int)(b) - 1; i >= (int)(a); --i)
#define all(v) begin(v), end(v)
#define rall(v) rbegin(v), rend(v)
using namespace std;
namespace {
using ll = long long;
using PLL = pair<ll, ll>;
template<class T, class U> bool chmin(T& a, const U& b) { return a > b ? a = b, true : false; }
template<class T, class U> bool chmax(T& a, const U& b) { return a < b ? a = b, true : false; }
constexpr ll inf = 1e18;
class UnionFind {
vector<int> par;
public:
UnionFind(int n) : par(n, -1) {}
int find(int x) { return par[x] < 0 ? x : par[x] = find(par[x]); }
bool merge(int x, int y) {
x = find(x); y = find(y);
if (x == y) return false;
if (par[x] > par[y]) swap(x, y);
par[x] += par[y];
par[y] = x;
return true;
}
};
}
void Joi(int N, int M, int A[], int B[], long long X, int T) {
vector<vector<int>> G(N);
{
UnionFind uf(N);
rep (i, M) {
if (!uf.merge(A[i], B[i])) continue;
G[A[i]].push_back(B[i]);
G[B[i]].push_back(A[i]);
}
}
int r = 0;
{
vector<int> dist(N, -1);
queue<int> que;
dist[0] = 0;
que.push(0);
while (!que.empty()) {
int v = que.front(); que.pop();
for (auto e : G[v]) {
if (dist[e] != -1) continue;
dist[e] = dist[v] + 1;
que.push(e);
}
}
rep (i, N) if (dist[i] > dist[r]) r = i;
}
vector<int> dist(N, -1);
{
queue<int> que;
dist[r] = 0;
que.push(r);
while (!que.empty()) {
int v = que.front(); que.pop();
for (auto e : G[v]) {
if (dist[e] != -1) continue;
dist[e] = dist[v] + 1;
que.push(e);
}
}
}
int mx = *max_element(all(dist));
if (mx >= 59) {
rep (i, N) MessageBoard(i, X >> (dist[i] % 60) & 1);
return;
}
rep (i, N) {
if (dist[i] == mx / 2) r = i;
}
vector<int> ord(N);
{
int cnt = 0;
auto dfs = [&](auto&& self, int v, int p) -> void {
ord[v] = cnt++;
for (auto e : G[v]) if (e != p) self(self, e, v);
};
dfs(dfs, r, -1);
}
rep (i, N) {
if (ord[i] < 60) MessageBoard(i, X >> ord[i] & 1);
else MessageBoard(i, 0);
}
}
#include "Ioi.h"
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (int)(n); ++i)
#define rep2(i, a, b) for (int i = (int)(a); i < (int)(b); ++i)
#define rrep(i, n) for (int i = (int)(n) - 1; i >= 0; --i)
#define rrep2(i, a, b) for (int i = (int)(b) - 1; i >= (int)(a); --i)
#define all(v) begin(v), end(v)
#define rall(v) rbegin(v), rend(v)
using namespace std;
namespace {
using ll = long long;
using PLL = pair<ll, ll>;
template<class T, class U> bool chmin(T& a, const U& b) { return a > b ? a = b, true : false; }
template<class T, class U> bool chmax(T& a, const U& b) { return a < b ? a = b, true : false; }
constexpr ll inf = 1e18;
class UnionFind {
vector<int> par;
public:
UnionFind(int n) : par(n, -1) {}
int find(int x) { return par[x] < 0 ? x : par[x] = find(par[x]); }
bool merge(int x, int y) {
x = find(x); y = find(y);
if (x == y) return false;
if (par[x] > par[y]) swap(x, y);
par[x] += par[y];
par[y] = x;
return true;
}
};
}
long long Ioi(int N, int M, int A[], int B[], int P, int V, int T) {
vector<vector<int>> G(N);
{
UnionFind uf(N);
rep (i, M) {
if (!uf.merge(A[i], B[i])) continue;
G[A[i]].push_back(B[i]);
G[B[i]].push_back(A[i]);
}
}
int r = 0;
{
vector<int> dist(N, -1);
queue<int> que;
dist[0] = 0;
que.push(0);
while (!que.empty()) {
int v = que.front(); que.pop();
for (auto e : G[v]) {
if (dist[e] != -1) continue;
dist[e] = dist[v] + 1;
que.push(e);
}
}
rep (i, N) if (dist[i] > dist[r]) r = i;
}
vector<int> dist(N, -1), par(N, -1);
{
queue<int> que;
dist[r] = 0;
que.push(r);
while (!que.empty()) {
int v = que.front(); que.pop();
for (auto e : G[v]) {
if (dist[e] != -1) continue;
dist[e] = dist[v] + 1;
par[e] = v;
que.push(e);
}
}
}
int mx = *max_element(all(dist));
if (mx >= 59) {
ll X = (ll)V << (dist[P] % 60);
if (dist[P] >= 59) {
rep (_, 59) {
X |= (ll)Move(par[P]) << (dist[par[P]] % 60);
P = par[P];
}
}
else {
while (P != r) {
X |= (ll)Move(par[P]) << (dist[par[P]] % 60);
P = par[P];
}
vector<int> vs;
int v = max_element(all(dist)) - dist.begin();
while (v != r) {
vs.push_back(v);
v = par[v];
}
reverse(all(vs));
rep (i, 59) X |= (ll)Move(vs[i]) << (dist[vs[i]] % 60);
}
return X;
}
rep (i, N) {
if (dist[i] == mx / 2) r = i;
}
par.assign(N, -1);
{
auto dfs = [&](auto&& self, int v, int p) -> void {
par[v] = p;
for (auto e : G[v]) if (e != p) self(self, e, v);
};
dfs(dfs, r, -1);
}
vector<ll> memo(N);
while (P != r) {
memo[par[P]] = Move(par[P]);
P = par[P];
}
ll X = 0;
{
int cnt = 0;
auto dfs = [&](auto&& self, int v, int p) -> bool {
X |= memo[v] << cnt;
++cnt;
if (cnt == 60) return true;
for (auto e : G[v]) if (e != p) {
memo[e] = Move(e);
if (self(self, e, v)) return true;
memo[v] = Move(v);
}
return false;
};
dfs(dfs, r, -1);
}
return X;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |