Submission #110629

#TimeUsernameProblemLanguageResultExecution timeMemory
110629gs14004Cats or Dogs (JOI18_catdog)C++17
38 / 100
3009 ms12408 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){
	if(a[v] == 0){
		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]});
		}
	}
	else{
		memset(dp[v], 0x3f, sizeof(dp[v]));
		dp[v][a[v]] = 0;
		for(auto &i : gph[v]){
			dp[v][a[v]] += min({dp[i][0], dp[i][1] + (a[v] == 2), dp[i][2] + (a[v] == 1)});
		}
	}
}

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...