有个问题不太懂。
我看教程的时候,作者建线段树是这么写的:
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]]
,rku 指的是新树中的 u 点在原树中的标号,但我觉得 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;
}
其中 idu 表示原树中 u 在新树中的标号。
他建树点权建的是原树的值,而他查询查的新树的标号,为什么是这样啊