警示后人 || 蒟蒻求助 : 如果你 MLE on #48
查看原帖
警示后人 || 蒟蒻求助 : 如果你 MLE on #48
254688
cool_milo楼主2022/6/24 07:48

昨天晚上好不容易在巨佬们的帮助下读懂了题解~~~ 想着这题代码短,喜提黑题,
然后就MLE on # 48一直过不去。
今天早上来调,发现如果我写

int update(int s)
{
	for(int i=0;i<v[s].size();i++)
		if(add(s,v[s][i]))	return true;
	for(int i=0;i<u[s].size();i++)
		if(add(u[s][i],s)) return true;
	return false;
 } 

int add(int u,int v)
{
	if(L[u] >= R[v])
		return 1;
	int Mu = L[u] + ((R[u] - L[u]) >> 1);
	int Mv = L[v] + ((R[v] - L[v]) >> 1);
	if(L[u] > Mv)
	{
		L[v] = Mv + 1;
		if(update(v)) return 1;
	}
	if(R[v] <= Mu)
	{
		R[u] = Mu;
		if(update(u))	return 1;
	}
	return 0;
}

就过不去,但如果是

void add(int u,int v)
{
	if(L[u] >= R[v])
	{
		flg = 1;
		return;
	}
	int Mu = L[u] + ((R[u] - L[u]) >> 1);
	int Mv = L[v] + ((R[v] - L[v]) >> 1);
	if(L[u] > Mv)
	{
		L[v] = Mv + 1;
		update(v);
	}
	if(R[v] <= Mu)
	{
		R[u] = Mu;
		update(u);
	}
}

就过得去,为什么?

简单来说,前一份代码每次调用都有返回值,后一份代码记录全局变量。

2022/6/24 07:48
加载中...