社区讨论

8分求调

P5836[USACO19DEC] Milk Visits S参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lo2ngree
此快照首次捕获于
2023/10/23 16:42
2 年前
此快照最后确认于
2023/10/23 16:42
2 年前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
//LCA
typedef long long ll;
typedef pair<int, int> pll;
const int N = 1e5 + 10, M = 3e5 + 10;
int n, m;
int h[N], e[M], ne[M], idx;
int depth[N], fa[N][18];
string cow;
void add(int a, int b) {
	e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
void bfs() {
	queue<int> q;
	q.push(1);
	depth[1] = 1;
	while (q.size()) {
		int t = q.front();
		q.pop();
		for (int i = h[t] ; ~i ; i = ne[i]) {
			int j = e[i];
			if (depth[j] == 0) {
				q.push(j);
				depth[j] = depth[t] + 1;
				fa[j][0] = t;
				for (int k = 1 ; k <= 16 ; ++k) {
					fa[j][k] = fa[fa[j][k - 1]][k - 1];
				}
			}
		}
	}
}
bool lca(int a, int b, char c) {
	if (depth[a] < depth[b]) swap(a, b);
	if(cow[a] == c || cow[b] == c) return 1;
	for (int k = 16 ; k >= 0 ; --k) {
		if (depth[fa[a][k]] >= depth[b]) {
			if (cow[fa[a][k]] == c) return 1;
			a = fa[a][k];
		}
	}
	if (a == b) {
		if (cow[a] == c) return 1;
		else return 0;
	}
	for (int k = 16 ; k >= 0 ; --k) {
		if (fa[a][k] != fa[b][k]) {
			if (cow[fa[a][k]] == c || cow[fa[b][k]] == c) return 1;
			a = fa[a][k], b = fa[b][k];
		}
	}
	if (cow[fa[a][0]] == c || cow[fa[b][0]] == c) return 1;
	return 0;
}
int main() {
	cin >> n >> m >> cow;
	cow = '?' + cow;
	memset(h, -1, sizeof h);
	for (int i = 1 ; i < n ; ++i) {
		int a, b;
		cin >> a >> b;
		add(a, b), add(b, a);
	}
	bfs();
	string ans;
	while (m--) {
		int a, b;
		char op;
		cin >> a >> b >> op;
		if (lca(a, b, op)) ans += '1';
		else ans += '0';
	}
	cout << ans << endl;
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...