警钟长鸣
查看原帖
警钟长鸣
1378097
zjinyi楼主2025/8/29 22:26

今天下午,我看我之前做这道题的代码,结果我发现一份代码 46 分,另一份 100 分:

// 其他部分都一样,只有 LCA 函数不同
// 46 pt:
int lca(int x, int y)
{
	if (dep1[x] > dep1[y])
	{
		for (int i = 1; i <= dep1[x] - dep1[y]; ++i)
		{
            x = father[x]; 
		}
	}
	else
	{
		for (int i = 1; i <= dep1[y] - dep1[x]; ++i)
		{
			y = father[y]; 
		}
	}
	while (x != y)
	{
		x = father[x];
		y = father[y];
	}
	return y;
}
// 100 pt:
int lca(int x, int y)
{
	if (dep1[x] > dep1[y])
	{
        int num = dep1[x] - dep1[y]; // 所以要提前定义一个变量,记录循环范围!!!
		for (int i = 1; i <= num; ++i)  // 所以他们深度的差值也会改变!!!
		{
            x = father[x]; // 这里会改变 x 的值
		}
	}
	else
	{
        int num = dep1[y] - dep1[x];
		for (int i = 1; i <= num; ++i)
		{
			y = father[y]; 
		}
	}
	while (x != y)
	{
		x = father[x];
		y = father[y];
	}
	return y;
} // 警钟长鸣

这种小错误,我脑子坏了竟然能调一下午,要是考场上这样脑抽就废了

2025/8/29 22:26
加载中...