题目链接
给出一颗有根树,每个节点有一个权值 w i w_i wi,求出所有子树的mex值,一个子树的mex值定义为在该子树中最小的未出现的正整数。
题解
Solution I
启发式合并
考虑暴力维护每颗子树包含的数据,当前子树包含的正整数就是所有儿子包含的正整数加上根,并且根据mex运算性质,父亲结点的mex值肯定大于等于儿子结点。
但是暴力合并的时空复杂度都是 O ( n 2 ) O(n^2) O(n2)。可以在合并的时候每次都将小的集合往大的集合合并,这样时间复杂度最坏为 O ( n l o g n ) O(nlogn) O(nlogn)。(当树为满二叉树的时候)
代码:
class Solution
{
public:
vector<int> mp[400005];
set<int> st[100005];
vector<int> mex;
void dfs(int u, int fa)
{
for (auto v : mp[u])
{
if (v == fa)
continue;
dfs(v, u);
if (st[u].

本文介绍了三种解决树中子树最小缺失整数问题的算法:启发式合并、权值1特殊路径优化和dfs序重标号。第一种方法通过合并减少复杂度至O(nlogn),第二种利用权值特点简化为O(n),第三种则结合dfs序使用线段树实现。
最低0.47元/天 解锁文章
1101

被折叠的 条评论
为什么被折叠?



