求助 dsu on tree WA on 50
查看原帖
求助 dsu on tree WA on 50
406941
Register_int-std=c++14楼主2022/12/18 23:42

应输出 0 实际输出 5

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int MAXN = 1e5 + 10;

struct node {
	int v, nxt;
} e[MAXN];

int head[MAXN], tot;

inline 
void add(int u, int v) {
	e[++tot] = { v, head[u] }, head[u] = tot;
}

int dep[MAXN], size[MAXN], son[MAXN];

void init(int u, int f) {
	size[u] = 1, dep[u] = dep[f] + 1;
	for (int i = head[u], v; i; i = e[i].nxt) {
		v = e[i].v;
		init(v, u), size[u] += size[v];
		if (size[son[u]] < size[v]) son[u] = v;
	}
}

vector<pair<int, int>> q[MAXN];

string s[MAXN];
map<string, int> cnt[MAXN];

int ans[MAXN];

void calc(int u, int p) {
	cnt[dep[u]][s[u]]++;
	for (int i = head[u]; i; i = e[i].nxt) if (e[i].v != p) calc(e[i].v, p);
}

void clear(int u) {
	cnt[dep[u]][s[u]]--;
	if (!cnt[dep[u]][s[u]]) cnt[dep[u]].erase(s[u]);
	for (int i = head[u]; i; i = e[i].nxt) clear(e[i].v);
}

void solve(int u) {
	for (int i = head[u], v; i; i = e[i].nxt) {
		v = e[i].v;
		if (v == son[u]) continue;
		solve(v), clear(v);
	}
	if (son[u]) solve(son[u]); calc(u, son[u]);
	for (auto x : q[u]) ans[x.second] = cnt[x.first].size();
}

int n, m;

int main() {
	scanf("%d", &n);
	for (int i = 1, u; i <= n; i++) cin >> s[i] >> u, u && (add(u, i), 1);
	for (int i = 1; i <= n; i++) if (!dep[i]) init(i, 0);
	scanf("%d", &m);
	for (int i = 1, u, k; i <= m; i++) scanf("%d%d", &u, &k), q[u].push_back({ dep[u] + k, i });
	for (int i = 1; i <= n; i++) if (dep[i] == 1) solve(i), clear(i);
	for (int i = 1; i <= m; i++) printf("%d\n", ans[i]);
}
2022/12/18 23:42
加载中...