史山LCA,24求助
查看原帖
史山LCA,24求助
398155
某kob在此楼主2024/8/14 23:39

真不知道错哪了 救救孩子罢

#include <bits/stdc++.h>
using namespace std;

int N, M;
string s;
int fa[100005][30], d[100005], H[100005], G[100005];
vector<int> son[100005];

void dfs(int now, int frt, int h, int g){
	fa[now][0] = frt;d[now] = d[frt] + 1;
	H[now] = h;G[now] = g;
	if (s[now - 1] == 'H')	H[now] = ++ h;
	else	G[now] = ++ g;
	
	for (int i = 0; i < son[now].size(); i ++){
		int nxt = son[now][i];
		if (nxt == frt)	continue;
		dfs(nxt, now, h, g);
	}
}
int LCA(int x, int y){
	if (x == y)	return x;
	if (d[x] < d[y])	swap(x, y);
	
	for (int i = 30; i >= 0; i --)
		if (d[fa[x][i]] >= d[y])	x = fa[x][i];
	
	if (x == y)	return x;
	
	for (int i = 30; 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;
	cin >> s;
	
	for (int i = 1; i < N; i ++){
		int X, Y;cin >> X >> Y;
		son[X].push_back(Y);
		son[Y].push_back(X);
	}
	
	dfs(1, 0, 0, 0);
	
	for (int k = 1; k <= 25; k ++)
		for (int i = 1; i <= N; i ++)
			fa[i][k] = fa[fa[i][k - 1]][k - 1];
	
	while (M --){
		int a, b, k1 = 0, k2 = 0;string c;
		cin >> a >> b;
		cin >> c;
		int p = LCA(a, b);
		if (c[0] == 'H'){
			if (s[p - 1] == 'H')	k1 = 1;
			if (a == b && s[a - 1] == 'H')	k2 = H[a];
			if (H[a] + H[b] - k1 - k2 - 2 * H[fa[p][0]] == 0)	cout << 0;
			else	cout << 1;
		}else{
			if (s[p - 1] == 'S')	k1 = 1;
			if (a == b && s[a - 1] == 'H')	k2 = G[a];
			if (G[a] + G[b] - k1 - k2 - 2 * G[fa[p][0]] == 0)	cout << 0;
			else	cout << 1;
		}
	}
	
	return 0;
}
2024/8/14 23:39
加载中...