启发式合并总结

其实思想很简单,每次把小的往大的上面合并,这样均摊复杂度就可以达到O(nlogn)

P3201 [HNOI2009] 梦幻布丁 

利用链表把一种颜色的连起来,每次更换颜色利用启发式合并维护颜色,顺便更显答案 代码

CF741D Arpa’s letter-marked tree and Me 

可以构成回文串意味着出现奇数次的字符有1/0个,观察到字符集比较小,所以我们采用二进制的方式存储,对于一条路径上的各个边的异或和,为0或者2的整数次幂即可。要求满足这样条件的最长的路径,记录1到x的异或和为D[x],那么u到v的路径和为D[u]^D[v]。再记c[x]表示状态为x的最大深度,然后就是利用dsu on tree(树上启发式合并)。每个点的答案来源于三种:完全在子树内;由u点向下引出的一条链;跨过u的一条路径。第一种完全可以递归解决,第二种直接计算一下和u节点异或和相同和为2^i的即可。第三种需要先处理完轻儿子,清空,最后处理重儿子,不清空,保留这部分信息,然后再将轻儿子的跑一遍,过程中计算出第三种情况的答案。这种dsu on tree的思想主要是节省了开大数组的空间(为了换每次清空的时间),具体看代码比较容易理解

代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值