vis[u] 跳过u(此时u为父亲的重儿子)
int dfs(u,是否删除u的子树(包含u))
{
for(int v:u)
{
dfs(v,不保存);
}
if(son[u]) dfs(son[u],保存);
vis[son[u]]=true;
calc(u,跳过son[u]);//重新计算u的轻儿子的答案
for(query of u)
{
ans[i]=(……);//处理关于u的答案
}
vis[son[u]]=0;//如果要删除整个u树的答案的话,重儿子就不应该跳过
//如果不要删,也无大碍
if(要删除u的子树(包含u)) Delete(u);
}
//对于另一种不用重链剖分的启发式合并,一般是用一个数据结构(map,set……)维护
//一个节点子树内的一个情况(各种颜色出现次数,数字个数……)
//然后这样是可以启发式合并的
//这类题目需要的答案一般都是找一个子树内的两个节点他们有什么关系(或者与更节电有什么关系)
//例如:两个节点乘积为u的节点二元组个数等等