虚树
虚树 (Compressed Tree)
定义
树上有一些关键点,有很多无用点,所以就关键点建树称为虚树。
建立虚树
不能只有关键点,一般还要有他们的lca,才能统计信息。信息的需求和统计方法多种多样,要求max,min,cnt等等。可以树链剖分+线段树或倍增法维护虚边。
可证虚树节点不超过 \(2k-1\),最坏情况考虑满二叉树
基本思想是对dfn排序,相邻求lca,具体可以用栈。
// namespace 版
void build_VT(){
sort(a+1,a+k+1,cmp);
stk[top=1] = 1;
VT::h[1] = 0;
for(int i=1;i<=k;++i){
if(a[i]!=1&&(i==1||a[i]!=a[i-1])){
int l=lca(a[i],stk[top]);
if(l!=stk[top]){
while(dfn[l]<dfn[stk[top-1]]){
lca(stk[top-1],stk[top]);
Vadd(stk[top-1],stk[top],d),top--;
}
if(dfn[l]>dfn[stk[top-1]]){
VT::h[l] = 0;
lca(stk[top],l);
Vadd(stk[top],l,d);
stk[top] = l;
}
else{
lca(stk[top],l);
Vadd(stk[top],l,d);
top--;
}
}
VT::h[a[i]] = 0;
stk[++top] = a[i];
}
}
for(int i=1;i<top;++i){
lca(stk[i+1],stk[i]);
Vadd(stk[i+1],stk[i],d);
}
}

浙公网安备 33010602011771号