其实思想很简单,每次把小的往大的上面合并,这样均摊复杂度就可以达到O(nlogn)
利用链表把一种颜色的连起来,每次更换颜色利用启发式合并维护颜色,顺便更显答案 代码
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的思想主要是节省了开大数组的空间(为了换每次清空的时间),具体看代码比较容易理解