求解
查看原帖
求解
838482
xuweichi楼主2023/7/27 23:48

这代码没有问题吧?

#include <bits/stdc++.h>
#define int long long
using namespace std;
vector<int> g[200005];
void add(int x, int y, int z)
{
	g[x].push_back(y);
	g[x].push_back(z);
}
int t, s[200005], f[200005][20], v[200005], n, m;
void dfs(int x, int y)
{
	f[x][0] = y;
	for (int i = 1; i < 20; i ++) 
	{
		f[x][i] = f[f[x][i - 1]][i - 1];	
	}
	if (g[x].size() == 0)
	{
		s[x] = 1;
		return;
	}
	s[x] = 0;
	for (int i = 0; i < g[x].size(); i ++)
	{
		int z = g[x][i];
		if(z == y) continue;
		dfs(z, x);
		s[x] += s[z];
	}
}
int check(int x, int y, int z)
{
	for (int i = 19; i >= 0; i --)
	{
		if (v[f[y][i]] <= x) y = f[y][i];
		if (v[f[z][i]] <= x) z = f[z][i];
	}
	if(x == y) return s[y];
	return s[y] + s[z];
}
int ar[200005];
int find(int x)
{
	return ar[x] == x ? x : ar[x] = find(ar[x]);
}
signed main()
{
	int x, y, z;
	cin >> n >> m;
	t = n;
	for (int i = 1; i <= 2 * n; i ++)
	{
		v[i] = 0;
		ar[i] = i;
	}
	v[0] = 1073741824;
	for (int i = 1; i <= m; i ++)
	{
		cin >> x >> y;
		int find_x = find(x), find_y = find(y);
		if (t < n * 2 - 1 && find_x != find_y)
		{
			t ++;
			v[t] = i;
			ar[find_y] = t;
			ar[find_x] = t;
			add(t, find_x, find_y);
		}
	}
	dfs(t, 0);
	int q;
	cin >> q;
	for (int i = 0; i < q; i ++)
	{
		cin >> x >> y >> z;
		int ans = m, l = 0, r = m;
		while (l <= r)
		{
			int mid = l + r >> 1;
			if (check(mid, x, y) < z) l = mid + 1, ans = l;
			else r = mid - 1;
		}
		cout << ans << "\n";
	}
	return 0;
}

过不了样例。

2023/7/27 23:48
加载中...