Homework Introduction

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n, son[N], siz[N], a[N], fa[N], id[N], tot, w[N];
int ans[N], res;
vector<int>e[N];
map<int, int>mp;

void dfs(int x, int f) {
	siz[x] = 1;
	fa[x] = f;
	int maxx = 0;
	id[x] = ++tot;
	w[tot] = a[x];
	for (auto v : e[x]) {
		if (v == f)
			continue;
		dfs(v, x);
		siz[x] += siz[v];
		if (maxx < siz[v]) {
			maxx = siz[v];
			son[x] = v;
		}
	}
}

void add(int x) {
	if (mp[x] == 0) {
		mp[x]++;
		res++;
	} else
		mp[x]++;
}

void del(int x) {
	if (mp[x] == 1) {
		res--;
	}
	mp[x]--;
}

void dsu(int x) {
	for (auto v : e[x]) {
		if (v == fa[x] || v == son[x])
			continue;
		dsu(v);
	}
	if (son[x])
		dsu(son[x]);
	//重儿子算完,和其他节点合并
	for (auto v : e[x]) {
		if (v == fa[x] || v == son[x])
			continue;
		for (int i = id[v]; i < id[v] + siz[v]; i++) {
			add(w[i]);
		}
	}
	add(a[x]);
	ans[x] = res;
	if (x != son[fa[x]]) {
		for (int i = id[x]; i < id[x] + siz[x]; i++) {
			del(w[i]);
		}
	}
}

int main() {
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	for (int i = 1; i < n; i++) {
		int x, y;
		cin >> x >> y;
		e[x].push_back(y);
		e[y].push_back(x);
	}
	dfs(1, 0);
	dsu(1);
	for (int i = 1; i <= n; i++) {
		cout << ans[i] << " ";
	}
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n, a[N], fa[N], siz[N], son[N], id[N], tot;
int cnt[N], Max; //cnt[i]出现次数为i的颜色的种类,Max出现最多颜色的出现次数
int w[N], ans[N];
vector<int>e[N];
map<int, int>mp;

void dfs(int x, int f) {
	fa[x] = f;
	siz[x] = 1;
	id[x] = ++tot;
	w[tot] = a[x];
	int maxx = 0;
	for (auto v : e[x]) {
		if (v == f)
			continue;
		dfs(v, x);
		siz[x] += siz[v];
		if (siz[v] > maxx) {
			maxx = siz[v];
			son[x] = v;
		}
	}
}

void add(int x) {
	cnt[mp[x]]--;
	mp[x]++;
	cnt[mp[x]]++;
	if (mp[x] > Max) {
		Max = mp[x];
	}
}

void del(int x) {
	cnt[mp[x]]--;
	mp[x]--;
	cnt[mp[x]]++;
	if (mp[x] == Max - 1) {
		if (cnt[Max] == 0) {
			Max = mp[x];
		}
	}
}

void dsu(int x) {
	for (auto v : e[x]) {
		if (v == fa[x] || v == son[x])
			continue;
		dsu(v);
	}
	if (son[x])
		dsu(son[x]);
	for (auto v : e[x]) {
		if (v == fa[x] || v == son[x])
			continue;
		for (int i = id[v]; i <= id[v] + siz[v] - 1; i++) {
			add(w[i]);
		}
	}
	add(w[id[x]]);
	ans[x] = (Max * cnt[Max] == siz[x]);
	if (x != son[fa[x]]) {
		for (int i = id[x]; i < id[x] + siz[x]; i++) {
			del(w[i]);
		}
	}
}

int main() {
	cin >> n;
	for (int i = 1; i <= n; i++) {
		int x, y;
		cin >> x >> y;
		a[i] = x;
		if (y == 0)
			continue;
		e[i].push_back(y);
		e[y].push_back(i);
	}
	dfs(1, 0);
	dsu(1);
	int tmp = 0;
	for (int i = 1; i <= n; i++) {
		tmp += ans[i];
	}
	cout << tmp << endl;
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n, k, siz[N], fa[N], son[N], dep[N], cnt[N];
int id[N], tot, mp[N], res;
vector<int>e[N];

void dfs(int x, int f) {
	fa[x] = f;
	siz[x] = 1;
	dep[x] = dep[f] + 1;
	int maxx = 0;
	id[x] = ++tot;
	mp[tot] = x;
	for (auto v : e[x]) {
		if (v == f)
			continue;
		dfs(v, x);
		siz[x] += siz[v];
		if (siz[v] > maxx) {
			maxx = siz[v];
			son[x] = v;
		}
	}
}

void add(int x) {
	cnt[x]++;
}

void del(int x) {
	cnt[x]--;
}

void dsu(int x) {
	for (auto v : e[x]) {
		if (v == fa[x] || v == son[x])
			continue;
		dsu(v);
	}
	if (son[x])
		dsu(son[x]);
	for (auto v : e[x]) {
		if (v == son[x] || v == fa[x])
			continue;
		for (int i = id[v]; i <= id[v] + siz[v] - 1; i++) {
			//针对每一个x点,计算有几个y和他的距离为k
			int a = mp[i];
			//dis[y] = k+2*dis[lca]-dis[x]
			//dis[x]+dis[b]-2*dis[x] = k
			//dis[b] = k+2*dis[x]-dis[a]
			int tmp = k + 2 * dep[x] - dep[a];
			if (tmp >= 1 && tmp <= n)
				res += cnt[tmp];
		}
		for (int i = id[v]; i <= id[v] + siz[v] - 1; i++) {
			add(dep[mp[i]]);
		}
	}
	int tmp = k + dep[x];
	if (tmp >= 1 && tmp <= n)
		res += cnt[tmp];
	add(dep[x]);
	if (x != son[fa[x]]) {
		for (int i = id[x]; i <= id[x] + siz[x] - 1; i++) {
			del(dep[mp[i]]);
		}
	}
}

int main() {
	cin >> n >> k;
	for (int i = 1; i < n; i++) {
		int x, y;
		cin >> x >> y;
		e[x].push_back(y);
		e[y].push_back(x);
	}
	dfs(1, 0);
	dsu(1);
	cout << res << endl;
	return 0;
}

Problem

Please claim the assignment to see the problems.
Status
Live...
Problem
6
Open Since
2025-10-21 0:00
Deadline
2025-12-31 23:59
Extension
24 hour(s)