24pts 求调qaq
查看原帖
24pts 求调qaq
404307
Toothless03楼主2025/1/14 23:33

马蜂清奇 轻点喷(

using namespace std;
constexpr int INF = 1e8;
constexpr float EPS = 1e-3;

vector<int> type, dep, siz, fa;
vector<int> dfn, rnk;
vector<int> htop, hson;
vector<vector<int>> edges;

void dfs1(int u) {
	siz[u] = 1;
	int ssiz = -1;
	hson[u] = -1;
	for (int v : edges[u]) {
		if (v == fa[u])
			continue;
		dep[v] = dep[u] + 1;
		fa[v] = u;
		dfs1(v);
		siz[u] += siz[v];
		if (ssiz < siz[v]) {
			ssiz = siz[v];
			hson[u] = v;
		}
	}
}

int cnt = 0;
void dfs2(int u) {
	rnk[cnt] = u;
	dfn[u] = cnt++;
	for (int v : edges[u]) {
		if (v == fa[u])
			continue;
		if (v == hson[u]) htop[v] = htop[u];
		else htop[v] = v;
		dfs2(v);
	}
}

void build(int n, int rt) {
	dep.resize(n);
	siz.resize(n);
	fa.resize(n);
	dfn	.resize(n);
	rnk.resize(n);
	htop.resize(n);
	hson.resize(n);
	
	fa[rt] = -1;
	dep[rt] = 0;
	dfs1(rt);

	htop[rt] = rt;
	dfs2(rt);
}

map<int, vector<int>> mp;
inline bool qsearch(int a, int b, int c) {	//[)
	int l = 0, r = mp[c].size();
	while (l != r) {
		int m = l + r >> 1;
		if (mp[c][m] >= b)
			r = m;
		else if (mp[c][m] < a)
			l = m + 1;
		else
			return true;
	}
	return false;
}
int main() {
//	freopen("milkvisits.in", "r", stdin);
//	freopen("milkvisits.out", "w", stdout);

	int n, m;
	cin >> n >> m;
	type.resize(n);
	edges.resize(n);
	
	for (int i = 0; i < n; i++)
		cin >> type[i];
	for (int i = 0, u, v; i < n - 1; i++) {
		cin >> u >> v;
		--u, --v;
		edges[u].push_back(v);
		edges[v].push_back(u);
	}
	
	int rt = 0;
	build(n, rt);

	for (int i = 0; i < n; i++)
		mp[type[i]].push_back(dfn[i]);

	for (auto& t : mp)
		sort(t.second.begin(), t.second.end());

	while (m--) {
		int u, v, c;
		cin >> u >> v >> c;
		--u, --v;

		bool d = false;

		while (htop[u] != htop[v] && !d) {
			if (dep[htop[u]] < dep[htop[v]])
				swap(u, v);
			d |= qsearch(dfn[htop[u]], dfn[u] + 1, c);
			u = fa[htop[u]];
		}
		if (dep[u] < dep[v])
			swap(u, v);
		d |= qsearch(dfn[v], dfn[u] + 1, c);

		cout << d;
	}

	cout << endl;

	return 0;
}
2025/1/14 23:33
加载中...