求助树上启发式合并 WA#6 悬关
查看原帖
求助树上启发式合并 WA#6 悬关
856179
LiuQJun_271119楼主2024/8/10 12:29

rt,不知道哪错了

#include <bits/stdc++.h>
#define ll long long
#define INF 2147483647

const ll N = 1e4, M = 100, MAXN = 1e8;

struct edge {
	ll nxt, to, w;
} e[2 * N + 5];
ll n, m, depp, cnt, tot, head[N + 5], q[M + 5], sz[N + 5], dis[N + 5], hson[N + 5], fa[N + 5], dfn[N + 5], rk[N + 5];
bool ans[M + 5], tf[MAXN + 5];

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

void dfs(ll x, ll fthr) {
	rk[dfn[x] = ++cnt] = x;
	sz[x] = 1;
	fa[x] = fthr;
	for (ll i = head[x]; i; i = e[i].nxt) {
		if (e[i].to == fthr) continue;
		dis[e[i].to] = dis[x] + e[i].w;
		dfs(e[i].to, x);
		sz[x] += sz[e[i].to];
		if (!hson[x] || sz[hson[x]] < sz[e[i].to])
			hson[x] = e[i].to;
	}
}

void upd(ll x) {
	for (ll i = 1; i <= m; i++)
		if (q[i] >= dis[x] - depp)
			ans[i] |= tf[q[i] - dis[x] + depp];
}

void dfs1(ll x, bool flag) {
	for (ll i = head[x]; i; i = e[i].nxt) {
		if (e[i].to == fa[x] || e[i].to == hson[x]) continue;
		dfs1(e[i].to, true);
	}
	if (hson[x]) dfs1(hson[x], false);
	tf[dis[x]] = true;
	depp = dis[x] << 1;
	upd(x);
	for (ll i = head[x]; i; i = e[i].nxt) {
	    if(e[i].to == fa[x] || e[i].to == hson[x]) continue;
		for (ll j = dfn[e[i].to]; j < dfn[e[i].to] + sz[e[i].to]; j++)
			upd(rk[j]);
		for (ll j = dfn[e[i].to]; j < dfn[e[i].to] + sz[e[i].to]; j++)
			tf[dis[rk[j]]] = true;
	}
	if (flag) {
		for (ll i = head[x]; i; i = e[i].nxt) {
		    if (e[i].to == fa[x] || e[i].to == hson[x]) continue;
			for (ll j = dfn[e[i].to]; j < dfn[e[i].to] + sz[e[i].to]; j++)
				tf[dis[rk[j]]] = false;
		}
	}
}

int main() {
//	freopen("P3806_6.in", "r", stdin);
	scanf("%lld%lld", &n, &m);
	for (ll i = 1; i < n; i++) {
		ll u, v, w; scanf("%lld%lld%lld", &u, &v, &w);
		add(u, v, w);
		add(v, u, w);
	}
	for (ll i = 1; i <= m; i++)
		scanf("%lld", q + i);
	dfs(1, 0);
	dfs1(1, false);
	for (ll i = 1; i <= m; i++)
		puts(ans[i] ? "AYE" : "NAY");
	return 0;
}
2024/8/10 12:29
加载中...