如果你刚学树链剖分求LCA,请记住swap一定要写在while里面,不然会死循环,把你T飞!
错误演示:
int lca(int x,int y)
{
if(deep[topp[x]]<deep[topp[y]])
{
swap(x,y);
}
while(topp[x]!=topp[y])
{
x=topp[x];
x=f[x];
}
return deep[x]<deep[y]?x:y;
}
正确演示:
int lca(int x,int y)
{
while(topp[x]!=topp[y])
{
if(deep[topp[x]]<deep[topp[y]])
{
swap(x,y);
}
x=topp[x];
x=f[x];
}
return deep[x]<deep[y]?x:y;
}