我有一个 大 大 的疑惑

P3806 【模板】点分治 1

Gyan @ 2021-11-14 21:37:42

萌新刚学淀粉质

学的 froggy 题解的双指针写法

我的 AC 代码: 100代码

inline int getroot(int);//返回重心
inline void calc(int);//计算答案

void dfz(int x) {//淀粉质
//  x = getroot(x);
    calc(x);
    del[x] = 1;//标记删除
    for (rg int e=head[x], y=to[e]; e; y=to[e=nxt[e]]) {
        if (del[y]) continue;
        dfz(getroot(y));
    }
}
int main() {
    //输入...

    dfz(getroot(1));

    //输出...

    return 0;
}

上面的代码是没问题的

但是我又把它改成了这样: 60代码

inline int getroot(int);//返回重心
inline void calc(int);//计算答案

void dfz(int x) {
    x = getroot(x);//把根节点更新为重心
    calc(x);
    del[x] = 1;//标记删除
    for (rg int e=head[x], y=to[e]; e; y=to[e=nxt[e]]) {
        if (del[y]) continue;
        dfz(y);
    }
}
int main() {
    //输入...

    dfz(1);

    //输出...

    return 0;
}

然后最后三个点就 T 飞了...

(实测 #7 要跑 7 秒)

求问大佬这是为什么....


by chen_qian @ 2021-11-14 21:40:10

@Gyan 你点分治不找重心吗?


by Gyan @ 2021-11-14 22:11:34

@chen_qian getroot就是返回重心啊,我注释里写了 /kk


by chen_qian @ 2021-11-15 07:28:28

@Gyan 你的60分代码里找了吗


by Gyan @ 2021-11-15 07:35:29

@chen_qian 60分的就是我把找重心放到点分治函数的最前面了


|