dsu on tree
昵称很长很长真是太好了
这个作者很懒,什么都没留下…
展开
-
2020 China Collegiate Programming Contest Changchun F - Strange Memory(dsu on tree + 位运算小技巧)
题目连接: https://codeforces.com/gym/102832/problem/F 首先写这个题的时候要注意内存的问题 不要瞎几把define int long long 题解: 考虑枚举LCA结点的话,好像跟dsu on tree有点像。 但是对于每个结点来说,如过每个结点的子树中找两个点等于根节点的值时间复杂度为O(n2)O(n^2)O(n2)的话,显然是不行的。 我们知道一个式子 如果a^b=c 那么b^c=a 那么这样的话,我们用一个cnt数组来记录一下 (假设这个lca结点只有两原创 2021-03-28 00:17:15 · 184 阅读 · 0 评论 -
阔力梯的树(2020 CCPC Wannafly Winter Camp Day2 Div.1&2 )dsu on tree
题解: dsu on tree dsu on tree的基本步骤就不说了 看到这题询问结点的子树问题,而且询问时离线的,首先想到的dsu on tree的这个trick。 本题的难题就是如何维护结点所有孩子的这个序列。 1.第一个权值插入时,对于整体是没有影响的,(最少需要2个结点才能对其做出贡献) 2.分类讨论权值插入的位置。 设插入的数为xxx (1).如果插入到第一位(假定编号为yyy)或者最后一位(假定编号为yyy),那么毋庸置疑增加的贡献为(x−y)∗(x−y)(x-y)*(x-y)(x−y)∗(原创 2021-03-17 22:10:56 · 119 阅读 · 0 评论 -
CF375D Tree and Queries(dsu on tree)
题解: 个人感觉这个题目是一个挺不错的题的。(这里就不说dsu on tree的这个过程是什么了) 我们在dsu on tree计算答案时需要有一个小小技巧去优化一下时间复杂度。 就是当我们用一个cnt数组把这颗某种颜色的个数都给统计下来后,我们如何才能在非常快的情况下找到超过次数为k的节点个数呢? 这里我们引入一个sum数组,用来储存超过次数为k的结点个数,怎么用呢? 假设当前颜色x的个数为cnt[x]。 那么如果cnt[x]+1,就代表着sum[cnt[x]+1]这个值,也会+1. 这样问题就解决了!原创 2021-03-17 19:37:47 · 142 阅读 · 0 评论 -
CF570D Tree Requests(dsu on tree)
题解: dsu on tree 首先dsu on tree是一个离线的算法,所以我们需要先把他们的询问储存起来,然后进行操作。 针对于每一个结点,我们先统计出他和他子树的所有信息,然后对于这个结点来说,我们已经把对于这个结点要查询的信息统计下来了,我们去暴力查询一下这个结点下深度每个字母的个数即可,对于出现次数为奇数的字母,我们最多可以允许有一个这样的字母(回文串放在中间)。最后输出即可。 代码: /*Keep on going Never give up*/ //#pragma GCC optimize(原创 2021-03-17 00:38:04 · 129 阅读 · 0 评论 -
dsu on tree 模板题目(CF600E Lomsat gelral)
题解: dsu on tree 对于结点i来说,步骤为: 递归轻儿子,不保留贡献。 递归重儿子,保留贡献。 统计当前结点及所有轻儿子的贡献。 拿个样例来解释算法的流程 比如说样例2: 如图所示,有多个结点的大小相同,重儿子应该是节点数目最多的那个子节点,那么我们假设1号结点的重儿子是4号结点。 递归轻儿子顺序与输入顺序有关系。 因为空间有限,我们无法把所有结点的状态给存起来,所以用的是1个cnt数组。 假设我们计算14号结点后要去计算15号结点,但是这两个结点用的是同一个cnt数组,那么当我们计算完14号结原创 2021-03-16 18:25:13 · 163 阅读 · 0 评论