Submission #1297611

#TimeUsernameProblemLanguageResultExecution timeMemory
1297611LucaLucaMCats or Dogs (JOI18_catdog)C++20
38 / 100
3097 ms5252 KiB
#include "catdog.h" #include <iostream> #include <vector> #include <algorithm> #include <cassert> using ll = long long; #define debug(x) #x << " = " << x < '\n' const int INF = 1e9; const int MAXN = 1e5; int dp[MAXN][3]; int type[MAXN]; std::vector<int> g[MAXN]; void dfs(int u, int p) { if (p != u) { g[u].erase(std::find(g[u].begin(), g[u].end(), p)); } for (int v : g[u]) { dfs(v, u); } } void dfsDP(int u) { dp[u][0] = dp[u][1] = dp[u][2] = +INF; dp[u][type[u]] = 0; for (int v : g[u]) { dfsDP(v); int nw[3] = {+INF, +INF, +INF}; for (int x = 0; x < 3; x++) { for (int y = 0; y < 3; y++) { nw[x] = std::min(nw[x], dp[u][x] + dp[v][y] + 1); if ((x | y) != 3) { nw[x | y] = std::min(nw[x | y], dp[u][x] + dp[v][y]); } } } dp[u][0] = nw[0]; dp[u][1] = nw[1]; dp[u][2] = nw[2]; } } void initialize(int N, std::vector<int> A, std::vector<int> B) { for (int i = 0; i + 1 < N; i++) { A[i]--, B[i]--; g[A[i]].push_back(B[i]); g[B[i]].push_back(A[i]); } dfs(0, 0); } int getAnswer() { dfsDP(0); return std::min({dp[0][0], dp[0][1], dp[0][2]}); } int cat(int v) { v--; type[v] = 1; return getAnswer(); } int dog(int v) { v--; type[v] = 2; return getAnswer(); } int neighbor(int v) { v--; type[v] = 0; return getAnswer(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...