16分求助
查看原帖
16分求助
637796
Xy_top楼主2024/7/26 16:02

已经改的和题解里的几乎一样了,还是过不了,调了半个小时了不知道哪里错了。

#include <bits/stdc++.h>
#define int long long
#define For(i, a, b) for (int i = (a); i <= (b); i ++)
#define foR(i, a, b) for (int i = (a); i >= (b); i --)
using namespace std;
int n, m;
int f[100005][17], g[100005], h[100005], dep[100005];
char s[100005];
vector <int> G[100005];
void dfs (int u, int fa) {
	for (int v : G[u]) {
		if (v == fa) return;
		f[v][0] = u;
		h[v] += h[u];
		g[v] += g[u];
		dep[v] = dep[u] + 1;
		dfs (v, u);
	}
}
int lca (int u, int v) {
	if (dep[u] < dep[v]) swap (u, v);
	foR (i, 16, 0) if (dep[f[u][i] ] >= dep[v]) u = f[u][i];
	if (u == v) return u;
	foR (i, 16, 0) if (f[u][i] != f[v][i]) {
		u = f[u][i];
		v = f[v][i];
	}
	return f[u][0];
}
void solve () {
	dep[1] = 1;
	cin >> n >> m >> s + 1;
	For (i, 1, n) {
		if (s[i] == 'H') h[i] = 1;
		else g[i] = 1;
	}
	For (i, 2, n) {
		int u, v;
		cin >> u >> v;
		G[u].push_back (v);
		G[v].push_back (u);
	}
	dfs (1, 0);
	For (i, 1, 16) For (j, 1, n) f[j][i] = f[f[j][i - 1] ][i - 1];
	For (i, 1, m) {
		int u, v;
		char c;
		cin >> u >> v >> c;
		int l = lca (u, v);
		if (c == 'H') {
			if ( (h[u] + h[v] - h[l] - h[f[l][0] ]) > 0) cout << 1;
			else cout << 0;
		} else {
			if ( (g[u] + g[v] - g[l] - g[f[l][0] ]) > 0) cout << 1;
			else cout << 0;
		}
	}
}
signed main () {
	int _ = 1;
//	cin >> _;
	while (_ --) {
		solve ();
		cout << '\n';
	}
	return 0;
}
2024/7/26 16:02
加载中...