求调(马蜂良好)
查看原帖
求调(马蜂良好)
1385996
ZSYhaouuan楼主2024/12/14 09:40
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 2e5+1000;
ll n, m;
vector<ll> G[N];
char c[N];
ll dep[N], fa[N][25], numH[N], numG[N];
void dfs(ll u, ll f, ll d) {
	dep[u] = d;
	fa[u][0] = f;
	numH[u] = numH[f] + (c[u] == 'H');
	numG[u] = numG[f] + (c[u] == 'G');
	for (ll i = 1; i <= 22; i++) {
		fa[u][i] = fa[fa[u][i - 1]][i - 1];
	}
	for (auto y : G[u]) {
		if (y != f) dfs(y, u, d + 1);
	}
	return;
}
ll lca(ll x, ll y) {
	if (dep[x] < dep[y]) swap(x, y);
	for (ll i = 22; i >= 0; i--) {
		if (dep[x] - (1 << i) >= dep[y]) x = fa[x][i];
	}
	if (x == y) return x;
	for (ll i = 22; i >= 0; i--) {
		if (fa[x][i] != fa[y][i]) x = fa[x][i], y = fa[y][i];
	}
	return fa[x][0];
}
int main() {
	cin >> n >> m;
	for (ll i = 1; i <= n; i++) {
		cin >> c[i];
	}
	for (ll i = 1; i < n; i++) {
		ll x, y;
		cin >> x >> y;
		G[x].push_back(y);
		G[y].push_back(x);
	}
	dfs(1, 0, 1);
	for (ll i = 1; i <= m; i++) {
		ll a, b;
		char ch;
		cin >> a >> b >> ch;
		ll p = fa[lca(a, b)][0];
		if (ch == 'H') cout << ((numH[a] - numH[p]) > 0) || ((numH[b] - numH[p]) > 0);
		else cout << ((numG[a] - numG[p]) > 0) || ((numG[b] - numG[p]) > 0);
	}
	return 0;
}
2024/12/14 09:40
加载中...