树剖操作1和操作2
  • 板块灌水区
  • 楼主lisida0820
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/2/27 17:32
  • 上次更新2023/10/28 07:35:27
查看原帖
树剖操作1和操作2
629192
lisida0820楼主2022/2/27 17:32

操作1和操作2代码如下

void upd(int x,int y,int val){//操作1 
    val%=mod;
    while (top[x]!=top[y]){
        if (dep[top[x]]<dep[top[y]])swap(x,y);
        update(1,dfn[top[x]],dfn[x],val);
        x=fa[top[x]];
    }
    if (dep[x]>dep[y])swap(x,y);
    update(1,dfn[x],dfn[y],val);
}
int que(int x,int y){//操作2 
    int ans=0;
    while (top[x]!=top[y]){
        if (dep[top[x]]<dep[top[y]])swap(x,y);
        ans+=query(1,dfn[top[x]],dfn[x]);
        x=fa[top[x]];
    }
    if (dep[x]>dep[y])swap(x,y);
    ans+=query(1,dfn[x],dfn[y]);
    return ans%mod;
}

在while语句中,if语句如果写成这样

if (dfn[top[x]]<dfn[top[y]])swap(x,y);

也不会出错,这是为什么呢? (dfn:当前结点的时间戳) (dep:当前结点的深度)

2022/2/27 17:32
加载中...