WA20求调(玄关)
查看原帖
WA20求调(玄关)
589190
YLgiegie楼主2024/7/26 17:45

A了#1和#4,求调qwq

#include <iostream>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std;
const int N = 1e5+10;
ll n , m , cnt , q;
ll head[N] , tot;
ll d[N] ,d1[N] , d2[N] , X , A , B , maxd;
ll ans;
int a , b , fa[N];
int Find(int x) {
	if(fa[x] == x) return x;
	return fa[x] = Find(fa[x]);
}
void Union(int x , int y) {
	int fx = Find(x) , fy = Find(y);
	if(fx != fy) fa[fx] = fy;
	d[fy] = max(d[fx] , max(d[fy] , (d[fx] + 1) / 2 + (d[fy] + 1) / 2 + 1));
}
void init() {
	for(int i = 1 ; i <= N ; i++) {
		fa[i] = i;
	}
	memset(head , -1 , sizeof head);
	tot = 0;
}
struct zzc {
	ll to , w , next;
}edge[N*2];
void add(ll x ,ll y) {
	edge[tot].to = y;
	edge[tot].next = head[x];
	head[x] = tot++; 
}
void add_ (ll x , ll y) {
	add(x , y);
	add(y , x);
}
void dfs(ll u, ll fa , ll rt) {
	for(int i = head[u] ; ~i ; i = edge[i].next) {
		ll v = edge[i].to , w = edge[i].w;
		if(v == fa) continue;
		dfs(v , u , rt);
		if(d1[v] +w > d1[u]) {
			d2[u] = d1[u];
			d1[u] = d1[v] + w;
		}
		else if(d1[v] + w > d2[u]) {
			d2[u] = d1[v] + w;
		}
	}
	maxd = max(maxd , d1[u] + d2[u]);
	d[rt] = maxd;
}
int main() {
	init();
	cin >> n >> m >> q;
	for(int i = 1 ; i <= m; i ++) {
		ll x , y;
		cin >> x >> y;
		Union(x , y);
//		add_(x , y);
	}
//	for(int i = 1 ; i <= m ; i ++) {
//		dfs(i , - , Find(i));
//	}
	for(int i = 1 ; i <= q ; i++) {
		ll op = 0 , x , y;
		cin >> op;
		if(op == 1) {
			cin >> x;
			cout << d[Find(x)] << '\n';
		}
		else {
			cin >> x >> y;
			Union(x , y);
			
		}
	}
}
2024/7/26 17:45
加载中...