蒟蒻求调,AC 5pts,代码总是输出0,
查看原帖
蒟蒻求调,AC 5pts,代码总是输出0,
463956
incra楼主2023/7/23 08:29

RT,代码中 if (s[u]==num) 一次都没有成立过。 代码

#include <iostream>
#include <cstring>
using namespace std;
const int N = 300010,M = 2 * N,MAX_LOG = 18;
int n,m;
int h[N],e[M],ne[M],tmpw[M],idx;
int f[N][MAX_LOG];
int dis[N];
int maxlen;
int dep[N];
int s[N],w[N];
int num,ans;
void add_edge (int a,int b,int c) {
	e[idx] = b;
	tmpw[idx] = c;
	ne[idx] = h[a];
	h[a] = idx++;
}
struct tran {
	int a,b,LCA,len;
}t[N];
void DFS1 (int u,int fa) {
	for (int i = h[u];~i;i = ne[i]) {
		int j = e[i];
		if (j == fa) continue;
		dep[j] = dep[u] + 1;
		dis[j] = dis[u] + tmpw[i];
		w[j] = tmpw[i];
		DFS1 (j,u);
		f[j][0] = u;
		for (int k = 1;k < MAX_LOG;k++) f[j][k] = f[f[j][k - 1]][k - 1];
	}
}
void DFS2 (int u,int fa) {
	for (int i = h[u];~i;i = ne[i]) {
		int j = e[i];
		if (j == fa) continue;
		DFS2 (j,u);
		s[u] += s[j];
	}
	if (s[u] == num) ans = max (ans,w[u]);
}
int get_LCA (int a,int b) {
	if (dep[a] < dep[b]) swap (a,b);
	for (int i = MAX_LOG - 1;i >= 0;i--) {
		if (dep[f[a][i]] >= dep[b]) a = f[a][i];
	}
	if (a == b) return a;
	for (int i = MAX_LOG - 1;i >= 0;i--) {
		if (f[a][i] != f[b][i]) a = f[a][i],b = f[b][i];
	}
	return f[a][0];
}
bool check (int x) {
	memset (s,0,sizeof (s));
	num = ans = 0;
	for (int i = 1;i <= m;i++) {
		if (t[i].len > x) {
			s[t[i].a]++,s[t[i].b]++,s[t[i].LCA] -= 2;
			num++;
		}
	}
	DFS2 (1,-1);
	return maxlen - ans <= x;
}
int main () {
	memset (h,-1,sizeof (h));
	cin >> n >> m;
	for (int i = 1;i <= n - 1;i++) {
		int a,b,c;
		cin >> a >> b >> c;
		add_edge (a,b,c),add_edge (b,a,c);
	}
	dep[1] = 1;
	DFS1 (1,-1);
	int maxlen = 0;
	for (int i = 1;i <= m;i++) {
		cin >> t[i].a >> t[i].b;
		t[i].LCA = get_LCA (t[i].a,t[i].b);
		t[i].len = dis[t[i].a] + dis[t[i].b] - 2 * dis[t[i].LCA];
		maxlen = max (maxlen,t[i].len);
	}
	int l = 0,r = maxlen;
	while (l < r) {
		int mid = l + r >> 1;
		if (check (mid)) r = mid;
		else l = mid + 1;
	}
	cout << l << endl;
	return 0;
}
2023/7/23 08:29
加载中...