求助
查看原帖
求助
1008001
lg15166366290楼主2024/9/11 11:25

树剖的lca函数

这样是正确的

ll ask(int i,int j,int k){
	ll ret=0;
	while(top[i]!=top[j]){
		if(dep[top[i]]<dep[top[j]])swap(i,j);
		ret=(ret+query(dfn[i],k)-query(dfn[top[i]]-1,k))%mod;
		ret=(ret+mod)%mod;
		i=f[top[i]];
	}
	if(dep[i]>dep[j])swap(i,j);
	ret=(ret+query(dfn[j],k)-query(dfn[i]-1,k))%mod;
	ret=(ret+mod)%mod;
	return ret;
}

如果改成下面这样,则会RE

ll ask(int i,int j,int k){
	ll ret=0;
	while(top[i]!=top[j]){
		if(dep[f[top[i]]]<dep[f[top[j]]])swap(i,j);//改动点
		ret=(ret+query(dfn[i],k)-query(dfn[top[i]]-1,k))%mod;
		ret=(ret+mod)%mod;
		i=f[top[i]];
	}
	if(dep[i]>dep[j])swap(i,j);
	ret=(ret+query(dfn[j],k)-query(dfn[i]-1,k))%mod;
	ret=(ret+mod)%mod;
	return ret;
}

求问这是问什么

2024/9/11 11:25
加载中...