Submission #1169616

#TimeUsernameProblemLanguageResultExecution timeMemory
1169616shiomusubi496Amusement Park (JOI17_amusement_park)C++20
0 / 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]); } } vector<int> ord(N); vector<int> memo(N); { int cnt = 0; auto dfs = [&](auto&& self, int v, int p, int d) -> void { ord[v] = cnt++; if (ord[v] < 60) memo[v] = ord[v]; else { ++d; memo[v] = (60 - d % 60) % 60; } for (auto e : G[v]) if (e != p) self(self, e, v, d); }; dfs(dfs, 0, -1, 0); } rep (i, N) MessageBoard(i, X >> memo[i] & 1); }
#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]); } } vector<int> ord(N), par(N), dep(N); { int cnt = 0; auto dfs = [&](auto&& self, int v, int p, int d) -> void { ord[v] = cnt++; par[v] = p; if (ord[v] >= 60) ++d; dep[d] = d; for (auto e : G[v]) if (e != p) self(self, e, v, d); }; dfs(dfs, 0, -1, 0); } ll X = 0, Y = 0; while (ord[P] >= 60) { int m = (60 - dep[P] % 60) % 60; X |= (ll)V << m; Y |= 1ull << m; if (Y == (1ull << 60) - 1) return X; V = Move(par[P]); P = par[P]; } int t = 60; rep (i, 60) { if (Y >> i & 1) { t = i; break; } } rep2 (i, t, 60) assert(Y >> i & 1); while (ord[P] >= t) { V = Move(par[P]); P = par[P]; } auto dfs = [&](auto&& self, int v, int p) -> void { X |= (ll)V << ord[v]; for (auto e : G[v]) { if (e == p) continue; if (ord[e] >= t) continue; V = Move(e); self(self, e, v); V = Move(v); } }; dfs(dfs, P, -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...