AC 不解
查看原帖
AC 不解
539211
lzyqwq楼主2022/11/12 19:33

这是 ACLCA 部分:

int lca(int x,int y){
    if(d[x]<d[y]){
        swap(x,y);
    }
    int ans=min(sz[getx(x)][gety(x)],sz[getx(y)][gety(y)]);
    while(d[x]^d[y]){
        ans=min(ans,mi[lg[d[x]-d[y]]][x]);
        x=f[lg[d[x]-d[y]]][x];
    }
    if(x==y){
        return ans;
    }
    for(int i=lg[d[x]];~i;--i){
        if(f[i][x]^f[i][y]){
            ans=min({ans,mi[i][x],mi[i][y]});
            x=f[i][x];
            y=f[i][y];
        }
    }
    return ans;
}

然而把统计答案的 ans 的初始化改一下,就 WA 60 了,为什么?按理说询问给出的两个点不相同,是不会漏统计本身贡献的啊。

int lca(int x,int y){
    if(d[x]<d[y]){
        swap(x,y);
    }
    int ans=2e9;
    while(d[x]^d[y]){
        ans=min(ans,mi[lg[d[x]-d[y]]][x]);
        x=f[lg[d[x]-d[y]]][x];
    }
    if(x==y){
        return ans;
    }
    for(int i=lg[d[x]];~i;--i){
        if(f[i][x]^f[i][y]){
            ans=min({ans,mi[i][x],mi[i][y]});
            x=f[i][x];
            y=f[i][y];
        }
    }
    return ans;
}

本人都是把点权转边权的,并且保证正确性。

2022/11/12 19:33
加载中...