Submission #1169567

#TimeUsernameProblemLanguageResultExecution timeMemory
1169567shiomusubi496Amusement Park (JOI17_amusement_park)C++20
10 / 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); } else { assert(false); } }
#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; } else { assert(false); } }
#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...