Submission #1253091

#TimeUsernameProblemLanguageResultExecution timeMemory
1253091kaiboyMousetrap (CEOI17_mousetrap)C++20
0 / 100
325 ms48512 KiB
#include <algorithm>
#include <iostream>

using namespace std;

const int N = 1000000;

int *ej[N], eo[N], dp[N], ii[N];

void append(int i, int j) {
	int o = eo[i]++;
	if (!o)
		ej[i] = (int *) malloc(sizeof *ej[i]);
	else if (!(o & o - 1))
		ej[i] = (int *) realloc(ej[i], (o << 1) * sizeof *ej[i]);
	ej[i][o] = j;
}

void detach(int i, int j) {
	for (int o = 0; o < eo[i]; o++)
		if (ej[i][o] == j) {
			swap(ej[i][o], ej[i][--eo[i]]);
			return;
		}
}

bool dfs(int p, int i, int t) {
	detach(i, p);
	bool yes = i == t;
	for (int o = 0; o < eo[i]; o++) {
		int j = ej[i][o];
		if (dfs(i, j, t))
			yes = true, swap(ej[i][o], ej[i][0]);
	}
	return yes;
}

void dfs0(int i) {
	for (int o = 0; o < eo[i]; o++)
		dfs0(ej[i][o]);
	sort(ej[i], ej[i] + eo[i], [] (int j0, int j1) { return dp[j0] > dp[j1]; });
	dp[i] = eo[i];
	for (int o = 1; o < eo[i]; o += 2)
		dp[i] += dp[ej[i][o]];
}

int main() {
	ios_base::sync_with_stdio(false), cin.tie(NULL);
	int n, s, t; cin >> n >> t >> s, s--, t--;
	for (int h = 0; h < n - 1; h++) {
		int i, j; cin >> i >> j, i--, j--;
		append(i, j), append(j, i);
	}
	dfs(-1, s, t);
	int k = 0;
	for (int i = s, j; i != t; i = j) {
		j = ej[ii[k++] = i][0];
		for (int o = 1; o < eo[i]; o++)
			dfs0(ej[i][o - 1] = ej[i][o]);
		sort(ej[i], ej[i] + --eo[i], [] (int j0, int j1) { return dp[j0] > dp[j1]; });
	}
	int ans = eo[ii[0]] + eo[ii[1]];
	for (int o = 1; o < eo[ii[0]]; o += 2)
		ans += dp[ej[ii[0]][o]];
	for (int o = (eo[ii[0]] % 2 == 0) + 1; o < eo[ii[1]]; o += 2)
		ans += dp[ej[ii[1]][o]];
	cout << ans << '\n';
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...