树剖的lca函数
这样是正确的
ll ask(int i,int j,int k){
ll ret=0;
while(top[i]!=top[j]){
if(dep[top[i]]<dep[top[j]])swap(i,j);
ret=(ret+query(dfn[i],k)-query(dfn[top[i]]-1,k))%mod;
ret=(ret+mod)%mod;
i=f[top[i]];
}
if(dep[i]>dep[j])swap(i,j);
ret=(ret+query(dfn[j],k)-query(dfn[i]-1,k))%mod;
ret=(ret+mod)%mod;
return ret;
}
如果改成下面这样,则会RE
ll ask(int i,int j,int k){
ll ret=0;
while(top[i]!=top[j]){
if(dep[f[top[i]]]<dep[f[top[j]]])swap(i,j);//改动点
ret=(ret+query(dfn[i],k)-query(dfn[top[i]]-1,k))%mod;
ret=(ret+mod)%mod;
i=f[top[i]];
}
if(dep[i]>dep[j])swap(i,j);
ret=(ret+query(dfn[j],k)-query(dfn[i]-1,k))%mod;
ret=(ret+mod)%mod;
return ret;
}
求问这是问什么