Submission #338391

#TimeUsernameProblemLanguageResultExecution timeMemory
338391KoDCats or Dogs (JOI18_catdog)C++17
38 / 100
34 ms4332 KiB
#include <bits/stdc++.h> template <class T> using Vec = std::vector<T>; constexpr int INF = 1000000000; int N; Vec<Vec<int>> graph; Vec<int> state; Vec<std::array<int, 3>> dp; void initialize(int N_, Vec<int> A, Vec<int> B) { N = N_; assert(N <= 1000); graph.resize(N); state.resize(N); dp.resize(N); for (int i = 0; i < N - 1; ++i) { graph[A[i] - 1].push_back(B[i] - 1); graph[B[i] - 1].push_back(A[i] - 1); } } void dfs(int u, int p) { dp[u][state[u]] = 0; if (state[u] == 0) { dp[u][1] = 0; dp[u][2] = 0; } for (auto v: graph[u]) { if (v != p) { dfs(v, u); const auto NoEffect = std::min(dp[v][0], std::min(dp[v][1], dp[v][2]) + 1); dp[u][state[u]] += std::min(NoEffect, dp[v][state[u]]); if (state[u] == 0) { dp[u][1] += std::min(NoEffect, dp[v][1]); dp[u][2] += std::min(NoEffect, dp[v][2]); } } } } int solve() { for (int i = 0; i < N; ++i) { dp[i].fill(INF); } dfs(0, -1); return std::min({ dp[0][0], dp[0][1], dp[0][2] }); } int cat(int u) { state[u - 1] = 1; return solve(); } int dog(int u) { state[u - 1] = 2; return solve(); } int neighbor(int u) { state[u - 1] = 0; return solve(); } #ifdef __APPLE__ int main() { int N; std::cin >> N; Vec<int> A(N - 1), B(N - 1); for (int i = 0; i < N - 1; ++i) { std::cin >> A[i] >> B[i]; } initialize(N, A, B); int Q; std::cin >> Q; for (int i = 0; i < N; ++i) { int T, v; std::cin >> T >> v; if (T == 1) { std::cout << cat(v) << '\n'; } if (T == 2) { std::cout << dog(v) << '\n'; } if (T == 3) { std::cout << neighbor(v) << '\n'; } } return 0; } #endif
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...