제출 #27024

#제출 시각아이디문제언어결과실행 시간메모리
27024ulnaAmusement Park (JOI17_amusement_park)C++14
0 / 100
89 ms262144 KiB
#include "Joi.h" #include <bits/stdc++.h> using namespace std; static vector<int> g[10055]; static int res[10055]; static int dfn[10055]; static int t; static int dp[10055]; void dfs(int v, int par = -1) { dfn[v] = t++; dp[v] = 1; for (auto u : g[v]) if (u != par) { dfs(u, v); dp[v] = max(dp[v], dp[u] + 1); } } void rdfs(int v, int par, long long X, int d = 0) { if (X & (1ll << (d % 60))) { res[v] = 1; } for (auto u : g[v]) if (u != par) { rdfs(u, v, X, d + 1); } } void init1() { for (int i = 0; i < 10000; i++) { g[i].clear(); res[i] = 0; dfn[i] = 0; t = 0; dp[i] = 0; } } void Joi(int N, int M, int A[], int B[], long long X, int T) { init1(); for (int i = 0; i < M; i++) { g[A[i]].push_back(B[i]); g[B[i]].push_back(A[i]); } dfs(0); if (dp[0] >= 60) { rdfs(0, -1, X); } else { vector<int> vec(N); for (int i = 0; i < N; i++) { vec[i] = i; } sort(vec.begin(), vec.end(), [&] (int u, int v) { return dfn[u] < dfn[v]; }); for (int i = 0; i < N; i++) { if (X & (1ll << (i % 60))) { res[i] = 1; } } } for (int i = 0; i < N; i++) { MessageBoard(i, res[i]); } }
#include "Ioi.h" #include <bits/stdc++.h> using namespace std; static int dp[10055]; static vector<int> g[10055]; static int dfn[10055]; static int t; static int depth[10055]; static bool used[10055]; static int par[10055]; void dfs(int v, int par = -1, int d = 0) { depth[v] = d; dfn[v] = t++; ::par[v] = par; dp[v] = 1; for (auto u : g[v]) if (u != par) { dfs(u, v, d + 1); dp[v] = max(dp[v], dp[u] + 1); } } void gao(int v, long long &res, int d = 1) { if (d == 60) return; if (Move(v)) { res |= (1ll << d); } for (auto u : g[v]) if (depth[u] == d + 1 && dp[u] + d + 1 >= 60) { gao(u, res, d + 1); break; } } static bool vis[10055]; void init() { for (int i = 0; i < 10000; i++) { used[i] = false; depth[i] = 0; t = 0; dfn[i] = 0; g[i].clear(); dp[i] = 0; } } inline bool check() { for (int i = 0; i < 60; i++) if (!used[i]) return false; return true; } inline void rdfs(int v, long long &res) { if (check()) return; used[dfn[v] % 60] = true; if (Move(v)) { res |= (1ll << (dfn[v] % 60)); } if (check()) return; for (auto u : g[v]) if (!vis[u]) { rdfs(u, res); Move(v); } } long long Ioi(int N, int M, int A[], int B[], int P, int V, int T) { init(); swap(P, V); for (int i = 0; i < M; i++) { g[A[i]].push_back(B[i]); g[B[i]].push_back(A[i]); } long long res = 0ll; dfs(0); if (dp[0] >= 60) { int cur = V; int last = P; while (depth[cur] % 60 != 0) { cur = par[cur]; last = Move(cur); } if (last) res |= 1; for (auto u : g[cur]) if (depth[u] > depth[cur] && dp[u] + 1 >= 60) { gao(u, res); break; } } else { int v = V; used[dfn[v] % 60] = true; if (P) res |= (1ll << (dfn[v] % 60)); vector<int> vec(N); for (int i = 0; i < N; i++) vec[i] = i; sort(vec.begin(), vec.end(), [&] (int u, int v) { return dfn[u] < dfn[v]; }); for (int u = v; !check(); u = par[u]) { vis[u] = true; for (auto w : g[u]) if (!vis[w]) { rdfs(w, res); if (check()) { break; } Move(u); } if (check()) break; if (Move(par[u])) { res |= (1ll << (dfn[par[u]] % 60)); } used[dfn[par[u]] % 60] = true; } } return res; }
#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...