Submission #110634

#TimeUsernameProblemLanguageResultExecution timeMemory
110634gs14004Cats or Dogs (JOI18_catdog)C++17
38 / 100
3034 ms10588 KiB
#include "catdog.h" #include <bits/stdc++.h> using namespace std; const int MAXN = 100005; const int inf = 1e9; int n, a[MAXN]; vector<int> gph[MAXN]; int dp[MAXN][3], par[MAXN]; void dfs(int x){ for(auto &i : gph[x]){ gph[i].erase(find(gph[i].begin(), gph[i].end(), x)); par[i] = x; dfs(i); } } void initialize(int N, std::vector<int> A, std::vector<int> B) { n = N; for(int i=0; i<n-1; i++){ gph[A[i]].push_back(B[i]); gph[B[i]].push_back(A[i]); } dfs(1); } void cons(int v){ memset(dp[v], 0, sizeof(dp[v])); for(auto &i : gph[v]){ dp[v][0] += min({dp[i][0], dp[i][1] + 1, dp[i][2] + 1}); dp[v][1] += min({dp[i][0], dp[i][1], dp[i][2] + 1}); dp[v][2] += min({dp[i][0], dp[i][1] + 1, dp[i][2]}); } if(a[v] == 1) dp[v][0] = dp[v][2] = 1e9; if(a[v] == 2) dp[v][0] = dp[v][1] = 1e9; } int cat(int v) { a[v] = 1; while(v){ cons(v); v = par[v]; } return min({dp[1][0], dp[1][1], dp[1][2]}); } int dog(int v) { a[v] = 2; while(v){ cons(v); v = par[v]; } return min({dp[1][0], dp[1][1], dp[1][2]}); } int neighbor(int v) { a[v] = 0; while(v){ cons(v); v = par[v]; } return min({dp[1][0], dp[1][1], dp[1][2]}); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...