昨天晚上好不容易在巨佬们的帮助下读懂了题解~~~
想着这题代码短,喜提黑题,
然后就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);
}
}
就过得去,为什么?
简单来说,前一份代码每次调用都有返回值,后一份代码记录全局变量。