求助树链剖分
  • 板块灌水区
  • 楼主UperFicial
  • 当前回复5
  • 已保存回复5
  • 发布时间2021/7/21 11:05
  • 上次更新2023/11/4 13:58:48
查看原帖
求助树链剖分
360511
UperFicial楼主2021/7/21 11:05

有个问题不太懂。

我看教程的时候,作者建线段树是这么写的:

void build(int l,int r,int x)
{
    if(l==r)
    {
        a[x].sum=v[rk[l]],a[x].l=a[x].r=l;
        return;
    }
    int mid=l+r>>1;
    a[x].ls=cnt++,a[x].rs=cnt++;
    build(l,mid,a[x].ls),build(mid+1,r,a[x].rs);
    a[x].l=a[a[x].ls].l,a[x].r=a[a[x].rs].r;
    pushup(x);
}

就是 l==r 的那个位置,它设 a[x].sum=v[rk[l]]rkurk_u 指的是新树中的 uu 点在原树中的标号,但我觉得 a[x].sum 应该设成在新树中的点权吧。

然后他查询是这么写的:

inline int sum(int x,int y)
{
    int ret=0;
    while(top[x]!=top[y])
    {
        if(d[top[x]]<d[top[y]])
            swap(x,y);
        (ret+=query(id[top[x]],id[x],rt))%=mod;
        x=f[top[x]];
    }
    if(id[x]>id[y])
        swap(x,y);
    return (ret+query(id[x],id[y],rt))%mod;
}

其中 iduid_u 表示原树中 uu 在新树中的标号。

他建树点权建的是原树的值,而他查询查的新树的标号,为什么是这样啊

2021/7/21 11:05
加载中...