Submission #110638

#TimeUsernameProblemLanguageResultExecution timeMemory
110638gs14004Cats or Dogs (JOI18_catdog)C++17
38 / 100
3099 ms10472 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 cons(int v){
	memset(dp[v], 0, sizeof(dp[v]));
	for(auto &i : gph[v]){
		dp[v][0] += min({dp[i][0] + (a[i] ? inf : 0), dp[i][1] + 1 + (a[i] == 2 ? inf : 0), dp[i][2] + 1 + (a[i] == 1 ? inf : 0)});
		dp[v][1] += min({dp[i][0] + (a[i] ? inf : 0), dp[i][1] + (a[i] == 2 ? inf : 0), dp[i][2] + 1 + (a[i] == 1 ? inf : 0)});
		dp[v][2] += min({dp[i][0] + (a[i] ? inf : 0), dp[i][1] + 1 + (a[i] == 2 ? inf : 0), dp[i][2] + (a[i] == 1 ? inf : 0)});
	}
}

int cat(int v) {
	a[v] = 1;
	while(v){
		cons(v);
		v = par[v];
	}
	if(a[1]) return dp[1][a[1]];
	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];
	}
	if(a[1]) return dp[1][a[1]];
	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];
	}
	if(a[1]) return dp[1][a[1]];
	return min({dp[1][0], dp[1][1], dp[1][2]});
}

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);
	}
	cons(x);
}

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);
}


#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...