题目:http://codeforces.com/contest/600/problem/E 看博客:https://blog.csdn.net/blue_kid/article/details/82192641 https://blog.csdn.net/clove_unique/article/details/60772212 还是不太明白复杂度... 代码如下: #include<iostream> #include<cstdio> #include<cstring&g…
学习:http://codeforces.com/blog/entry/44351 E. Lomsat gelral 题意: 给定一个以1为根节点的树,每个节点都有一个颜色,问每个节点的子树中,颜色最多的是哪几种颜色,输出这些颜色的值得和. 思路: 树上启发式合并的模板题,具体来说,先对树进行树链剖分,分出一个重链和轻边,dfs时,把每条轻儿子暴力加到根节点中,每次加的时候,用这样的技巧 if(csz < cnt[col[v]]) sum = col[v] , csz = cnt[col[v]]…
题目链接:http://codeforces.com/contest/600/problem/E 给你一棵树,告诉你每个节点的颜色,问你以每个节点为根的子树中出现颜色次数最多的颜色编号和是多少. 最容易想到的是n*n的暴力,但是会超时.所以这里用到类似并查集的合并,对于每个子树颜色种数少的合并到颜色种数大的当中. 不懂的看代码应该可以明白. //#pragma comment(linker, "/STACK:102400000, 102400000") #include <alg…
(题面来自luogu) 题意翻译 一棵树有n个结点,每个结点都是一种颜色,每个颜色有一个编号,求树中每个子树的最多的颜色编号的和. ci <= n <= 1e5 裸题.统计时先扫一遍得到出现次数最大值,然后再扫一遍看哪个颜色的出现次数与mxCnt相等.注意用一个bool数组判重,清空轻儿子贡献时要顺手把bool数组也打成false.(这是错的,请看下一份代码) 代码: #include <iostream> #include <cstdio> #include <…
题目描述 有一棵 \(n\) 个结点的以 \(1\) 号结点为根的有根树. 每个结点都有一个颜色,颜色是以编号表示的, \(i\) 号结点的颜色编号为 \(c_i\)​. 如果一种颜色在以 \(x\) 为根的子树内出现次数最多,称其在以 \(x\) 为根的子树中占主导地位.显然,同一子树中可能有多种颜色占主导地位. 你的任务是对于每一个 \(i\in[1,n]\),求出以 \(i\) 为根的子树中,占主导地位的颜色的编号和. \(n≤10^5,c_i\le n\) 输入输出样例 输入 #1 4…
E. Lomsat gelral http://codeforces.com/contest/600/problem/E 题意: 求每个子树内出现次数最多的颜色(如果最多的颜色出现次数相同,将颜色编号求和). 分析: dsu on tree. 这个可以解决一系列不带修改的子树查询问题. 考虑暴力的思路:就是枚举每个子树,计算每个颜色出现的个数.统计答案. dsu on tree:最后一个子树枚举计算完了,它的贡献可以保留,然后用其它的子树去合并.(最后一棵子树是最大的).现在的复杂度就是nlog…
600E - Lomsat gelral 题意 给出一颗以 1 为根的树,每个点有颜色,如果某个子树上某个颜色出现的次数最多,则认为它在这课子树有支配地位,一颗子树上,可能有多个有支配的地位的颜色,对每颗子树分别求有支配地位的颜色的和(把颜色这个权值相加). 分析 树上启发式合并模板题. 参考blog1 参考blog2 复杂度证明 如果暴力去搜索,显然是 \(O(n^2)\) 的算法,可以考虑优化,当我们搜索到节点 u 时,最后去搜索 u 的子节点中子树节点数量最大的子节点(树链剖分求出重儿子)…
[Codeforces600E] Lomsat gelral(树上启发式合并) 题面 给出一棵N个点的树,求其所有子树内出现次数最多的颜色编号和.如果多种颜色出现次数相同,那么编号都要算进答案 N≤100000 分析 树上启发式合并,用map记录颜色出现次数,合并的时候更新最多的出现次数和编号和. 注意合并时的下标问题.当我们merge(x,y)的时候,由于是启发式合并,s[x]可能会并到s[y]去,如果我们直接查询s[x],就查不到真正的答案.所以要再建立一个数组id[x],记录x的map合并…
题目戳我 \(\text{Solution:}\) 树上启发式合并,是对普通暴力的一种优化. 考虑本题,最暴力的做法显然是暴力统计每一次的子树,为了避免其他子树影响,每次统计完子树都需要清空其信息. 但是,如果我们先对非\(x\)的节点进行统计,最后统计\(x\)然后合并其他节点的信息,那么,\(x\)的统计信息就没有必要被删掉. 那么显然地,\(x\)的子树越大越好. 于是,自然想到轻重链剖分,并将\(x\)设置为其重儿子.于是,算法模型如下: 对所有非重儿子进行统计并清空其所记录的统计信息.…
题目链接 题目大意:给出一颗含有$n$个结点的树,每个节点有一个颜色.求树中每个子树最多的颜色的编号和. ------------------------- 树上启发式合并(dsu on tree). 我们先考虑暴力怎么做.遍历整颗树,暴力枚举子树然后用桶维护颜色个数.这样做是$O(n^2)$的,显然会T.我们需要一种更快的算法:树上启发式合并. 关于启发式算法的介绍,详见OI Wiki.本文只介绍树上启发式合并算法.本题的解法: 每处理完一颗子树,我们都要把桶清空一次,以免对它的兄弟造成影响.…