树上问题,树上统计,子树统计,dsu on tree,启发式合并,树上启发式合并 模板

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的节点二元组个数等等 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值