虚树

虚树 (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);
	}
}
posted @ 2024-02-16 11:55  妖灵梦  阅读(24)  评论(0)    收藏  举报