虚树的构建是不是有两种方法 一种长这样:
void insert(int x){
if(op == 1){op++ , q[op] = x;return;}
int LCA = lca(q[op] , x);
if(LCA == q[op])return;
while(op > 1 && dfn[q[op - 1]] >= dfn[LCA]){
add2(q[op - 1] , q[op]) , op--;
}
if(LCA != q[op]){
add2(LCA , q[op]) , q[op] = LCA;
}
q[++op] = x;
}
另一种长这样
for(int i = 1 ; i < m ; i++)Q[++len2] = lca(Q[i] , Q[i + 1]);
sort(Q + 1 , Q + 1 + len2 , cmp);
len2 = unique(Q + 1 , Q + 1 + len2) - (Q + 1);
for(int i = 1 ; i <= len2 ; i++){
while(len >= 1){
if(L[q[len]] <= dfn[Q[i]] && dfn[Q[i]] <= R[q[len]]){
h2[q[len]].push_back(Q[i]);
break;
}
len--;
}
q[++len] = Q[i];
}