RT.我在代码中使用第一段LCA只能得70分,而换上第二段便能AC:
void LCA(int x,int y){
val1=val2=-1e18;
if(dep[x]<dep[y]) swap(x,y);
for(int i=17;i>=0;i--)
if(dep[f[i][x]]>=dep[y])
x=f[i][x],update(x,i);
if(x==y) return;
for(int i=17;i>=0;i--)
if(f[i][x]!=f[i][y]){
x=f[i][x],y=f[i][y];
update(x,i),update(y,i);
}
update(x,0),update(y,0);
}
void LCA(int x, int y){
val1=val2=-1e18;
if(dep[x]<dep[y]) swap(x,y);
while(dep[x]>dep[y]){
int i=(int)log2(dep[x]-dep[y]);
update(x,i),x=f[i][x];
}
if(x==y) return;
for(int i=(int)log2(dep[x]);i>=0;i--)
if(f[i][x]!=f[i][y]){
update(x,i),update(y,i);
x=f[i][x];
y=f[i][y];
}
update(x,0),update(y,0);
}