启发式合并
文章平均质量分 61
树上启发式合并和普通的启发式合并
Jozky86
这个作者很懒,什么都没留下…
展开
-
Gym102832K. Ragdoll(CCPC长春)
Gym102832K. Ragdoll(CCPC长春)题意:n个点,每个点都有自己的权值aia_iai,一开始第i个点在第i个集合里。如果一对点(i,j)是bad当且仅当满足i和j在同一个集合里,且gcd(ai,aj)=ai⊕ajgcd(a_i,a_j)=a_i⊕a_jgcd(ai,aj)=ai⊕aj现在有3种操作:新增一个点x(在新的一个集合里),值为v合并两个集合x和y将点x的值改为v有m个操作,请输出每次操作后有多少对点是bad题解:一开始无从下手,因为这个式子不知道原创 2021-10-21 12:36:51 · 164 阅读 · 0 评论 -
cf375D. Tree and Queries
cf375D. Tree and Queries题意:给你一颗有根树,每个点都有一个颜色,有m次询问,问以u为根的子树中,相同颜色数量超过k的有多少种颜色?题解:这个题做法很多,有莫队分块,这里用的dsu就是对于一个子树内的颜色进行记录,为了方便我们后面的数量统计,对于一个子树中所有颜色出现次数,我们用树状数组来维护。比如颜色1已经出现了2两次,又出现了一次,那么我们就在树状数组中将2的位置减1,将位置3加1,树状数组维护的是颜色出现的数量。这样对于出现次数大于等于k的颜色种类,我们直接query原创 2021-09-03 14:28:46 · 175 阅读 · 0 评论 -
cf1009F. Dominant Indices
cf1009F. Dominant Indices题意:1号节点为根,问对于以每个点为根的子树种,求某个深度节点最多的层数。如果多个相等,输出深度小的。题解:直接dsu就完事了,相当于是求子树的众数,但是注意常数,一开始因为常数过大在第100点wa了将可以合并的dfs套在一起写,减少常数代码:// Problem: F. Dominant Indices// Contest: Codeforces - Educational Codeforces Round 47 (Rated for Di原创 2021-09-03 12:41:23 · 182 阅读 · 0 评论 -
cf246E. Blood Cousins Return
cf246E. Blood Cousins Return题意:给你一个森林,每个点都有自己的种类,问以v为根节点的子树中,与v距离为k的节点有多少种题解:和cf208E. Blood Cousins这个题差不多,就是多了一个种类,用一个unordered_map对名字进行编号,用map对每一层的名字进行标记,(能用unordered_map的就不要用map,不然后超时)详细看代码代码:// Problem: E. Blood Cousins Return// Contest: Codefor原创 2021-09-02 20:22:53 · 184 阅读 · 0 评论 -
cf208E. Blood Cousins
cf208E. Blood Cousins题意:给你一个森林,m次询问,每次询问(v,p),问v的p-cousin有多少?p-cousin指的是与v在同一层且他们到lca的距离都是p题解:对于每次询问(v,p),我们都可以通过其找到v的p距离的父亲节点fa,然后去找以fa为根节点,到fa的距离为p的节点的数量,然后更新答案。用树上启发式合并来实现答案就是fa的子树中,深度为dep[fa]+p-1(减1是将v本身减去)代码:// Problem: E. Blood Cousins// Cont原创 2021-09-02 17:35:10 · 216 阅读 · 0 评论 -
Strange Memory Gym - 102832F
Strange Memory Gym - 102832F题意:有一颗n个节点的树,求下面公式的值:题解:a ⊕ b = c 可以推出a ⊕ c = b那么ai⊕aj=alca(i,j)a_{lca(i,j)}alca(i,j),可以得到:ai⊕alca(i,j)a_{lca(i,j)}alca(i,j)=aj,ai就是我们要找到元素,也就是说在根为lca(i,j)的子树里,我们要找到值为aj的下标j,然后用j去和i异或,这样的复杂度是O(n2logn)O(n^2logn)O(n2logn)原创 2021-08-23 20:29:29 · 196 阅读 · 0 评论 -
P2634 [国家集训队]聪聪可可(树上启发式合并)
P2634 [国家集训队]聪聪可可(树上启发式合并)题意:一颗n个点的树,问其中两点之间的边上数的和加起来是3的倍数的点对有多少个?输出这样的点对所占比例题解:没有修改,统计边长为3的倍数,经典的树上路径统计,树上启发式请求一战但是调了一阵子没调出来,我对dsu的理解还是不够深,代码:待修改代码#include <bits/stdc++.h>#include <unordered_map>#define debug(a, b) printf("%s = %d\n原创 2021-08-19 17:10:35 · 77 阅读 · 0 评论 -
cf570 D. Tree Requests
cf570 D. Tree Requests题意:给定一个以 1 为根的 n 个结点的树,每个点上有一个字母(a-z)。每次询问 a, b 查询以 a 为根的子树内深度为 b 的结点上的字母重新排列之后是否能构成回文串。题解:回文串形成条件?如果回文串是偶数个,那就要求每个字符都是出现偶数次如果回文串是奇数个,那么说明只有一个字符是奇数次,其他都是偶数次总结:最后只能有一个字符出现奇数次现在我们开始统计一个子树内的各字符出现次数,可以用树上启发式合并来做,因为有q组询问,对于每组询问我们存下原创 2021-08-19 14:40:09 · 205 阅读 · 0 评论 -
cf600 E. Lomsat gelral
cf600 E. Lomsat gelral题意:给出一个树,求出每个节点的子树中出现次数最多的颜色的编号和题解:树上启发式合并树上启发式合并讲解其实就是:递归轻儿子,消除影响,递归重儿子,不消除影响,递归轻儿子void Dsu(int x,int fa,int opt){ for(all Edge){ if(to!=fa&&to!=BigSon[x])//暴力统计轻边的贡献 dfs(to,x,0); } if(son[x]) dfs(BigSon[x],x原创 2021-08-19 00:32:11 · 176 阅读 · 0 评论 -
CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths
CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths题意:一棵根为1 的树,每条边上有一个字符(a-v共22种)。 一条简单路径被称为Dokhtar-kosh当且仅当路径上的字符经过重新排序后可以变成一个回文串。 求每个子树中最长的Dokhtar-kosh路径的长度。题解:树上启发式合并的开山之作树上启发式合并介绍详细题解字符重排后为字符串,说明该字符中最多只有一个字符出现奇数次,其余都是偶数次,我们联想到用异或操作原创 2021-07-27 11:12:36 · 294 阅读 · 0 评论 -
树上启发式合并
文章内容选自OI Wiki内容:树上启发式合并(dsu on tree)对于某些树上离线问题可以速度大于等于大部分算法且更易于理解和实现的算法。例题:给出一棵 n个节点以 1为根的树,节点 u的颜色为cu ,现在对于每个结点 u询问 u子树里一共出现了多少种不同的颜色。n<=2e5树套树可以解决,如果可以离线的话,树上莫队复杂度带根号,现在我们要用一个带log的算法。对于直接暴力复杂度为O(n^2),即对每一个子节点进行一次遍历,对于每个节点的答案是由其子树和其本身得到的,现在考虑利原创 2021-07-27 10:46:43 · 479 阅读 · 0 评论