![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
启发式合并
Love_xyh
这个作者很懒,什么都没留下…
展开
-
CF570D Tree Requests
题目大意:给定一个以1为根的n个节点的树,每个点上有一个字母(a-z),每个点的深度定义为该节点到1号节点路径上的点数。每次询问 a,b.查询以a为根的子树内深度为b的节点上的字母重新排列之后是否能构成回文串.重排之后构成回文串的条件是:每个字母出现次数都为偶数或者只有一个字母出现次数为奇数。因此我们可以直接维护cnt数组来统计子树中在某个深度上每个字符出现次数,然后再检查是否符合条件就行了。至于查询操作,我们可以离线处理,然后把它挂在节点上,每当统计到该节点时,更新答案就行了。时间复杂度:O(26原创 2020-08-31 16:15:31 · 183 阅读 · 0 评论 -
CF600E Lomsat gelral
题意:一棵树有n个结点,每个结点都是一种颜色,每个颜色有一个编号,求树中每个子树的最多的颜色编号的和。考虑如何用dsu on tree来做。我们不难想到一个暴力的做法,用一个全局sum数组记录颜色出现次数,对每个节点,遍历其所有子树,然后统计答案,最后再清空sum数组(不清空的话会对影响到其他节点),这个时间复杂度是O(n^2),肯定过不去。然后我们可以考虑一个优化,遍历到最后一个子树时是不用清空的,因为它不会产生对其他节点影响了,根据贪心的思想我们当然要把节点数最多的子树(即重儿子形成的子树)放在最原创 2020-08-31 16:04:09 · 190 阅读 · 0 评论 -
[HNOI2009] 梦幻布丁
如果每次将数量小的颜色,替换为数量大的颜色,那么由于一个格子,最多被换logn次,复杂度即为O(n log n)。所以,我们就用f[x]记录:每个初始颜色为x的颜色,的当前值为多少。(因为根据sum大小换过了颜色)而对于不同颜色的遍历,我们可以用类似链式前向星(或链表)的东西来存储。#include <bits/stdc++.h>using namespace std;const int N=1e5+5,M=1e6+5;int n,m,opt,x,y,ans;int a[N],f[原创 2020-09-10 04:54:33 · 201 阅读 · 0 评论