Submission #1169579

#TimeUsernameProblemLanguageResultExecution timeMemory
1169579shiomusubi496Amusement Park (JOI17_amusement_park)C++20
81 / 100
13 ms1372 KiB
#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); memo[P] = V; 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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...