MLE20pts求调qwq
查看原帖
MLE20pts求调qwq
742017
zhangxiao666楼主2024/7/25 15:55

rt

#include <bits/stdc++.h>
using namespace std;
const int N = 3e5 + 10;
int n, m, q, cnt, len;
array<int, N> fa;
vector<int> e[N];
array<int, N> f, g, l;
array<bool, N> vis;

void Add(int x, int y)
{
	e[x].push_back(y);
	e[y].push_back(x); 
}

int Find(int x)
{
	if (fa[x] != x) fa[x] = Find(fa[x]);
	return fa[x];
}

void Merge(int x, int y)
{
	int fx = Find(x), fy = Find(y);
	if (fx != fy) 
		fa[fx] = fy;
}

void Dfs(int u, int F)
{
	f[u] = g[u] = -1;
	for (int v : e[u])
	{
		if (v == F) continue;
		Dfs(u, v);
		if (f[v] + 1 > f[u]) 
			g[u] = f[u], f[u] = f[v] + 1;
		else if (f[v] + 1 > g[u])
			g[u] = f[v] + 1;
	}
	len = max(len, max(max(0, f[u] + g[u]), max(f[u], g[u])));
}

int main()
{
	std::ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	cin >> n >> m >> q;
	for (int i = 1; i <= n; i++)
		fa[i] = i;
	for (int i = 1; i <= m; i++)
	{
		int x, y; cin >> x >> y;
		Add(x, y), Merge(x, y);
	}
	
	for (int i = 1; i <= n; i++)
	{
		if (!vis[i] && fa[i] == i)
		{
			len = 0;
			Dfs(i, 0);
			l[i] = len, vis[i] = 1; 
		}
	}
	
	while (q--)
	{
		int op; cin >> op;
		if (op == 1)
		{
			int x; cin >> x;
			cout << l[Find(x)] << '\n';
		}
		else
		{
			int x, y; cin >> x >> y;
			int fx = Find(x), fy = Find(y);
			if (fx == fy) continue;
			len = max((l[fx] + 1) / 2 + (l[fy] + 1) / 2 + 1, max(l[fx], l[fy]));
			
			Merge(x, y); l[Find(x)] = len;
		}
	}
	return 0;
}

https://www.luogu.com.cn/record/168467287 (怀疑是递归爆栈了)

2024/7/25 15:55
加载中...