题意:

一棵n个节点的树,每个节点都有一种颜色,如果颜色c在以u为根的子树中出现的次数大于等于一半,那么这个颜色就是u节点的支配色, 因为是大于等于,所以一个节点的支配色可能不止一种,求出每个节点的支配色编号和

思路:

一个无脑的暴力:

  • DFS整棵树,对于当前节点u,再DFS下以它为根的子树内所有的节点,相当于DFS套DFS
  • 复杂度O(n²),当整棵树为一条链时复杂度最高

优化一下上面的暴力:

  • 考虑DFS的过程,对于节点u的所有儿子~,一定是将前一个儿子的子树全部搜完,才开始搜下一个儿子
  • 当然,每当计算完以为根的子树的答案后,一定要删除贡献,才能继续搜索下一个儿子
  • 然而在搜完最后一个儿子后,并不需要删除贡献!因为紧接着你要计算的是以u为根的子树的答案,是被包在里面的

这样的话,当一条链的时候,原先是最坏情况,在优化之后就成了最好情况,O(n)就能解决

不过复杂度好像仍然是O(n²)?

……

其实到这里dsu on tree就已经讲完了

因为dsu on tree就是上述的暴力,唯一的区别是:对于当前节点u,最后一个搜索的儿子一定是它的重儿子

可以证明这样暴力的话复杂度是O(nlogn)的,当然这里就不证了,证明依赖于树链剖分

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<string>
#include<math.h>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
#define LL long long
#define mod 1000000007
vector<int> G[100005];
int col[100005], siz[100005], hson[100005], vis[100005], all[100005], bet;
LL ans[100005], sum;
void Sech1(int u, int p)
{int i, v;siz[u] = 1;for(i=0;i<G[u].size();i++){v = G[u][i];if(v==p)continue;Sech1(v, u);siz[u] += siz[v];if(siz[v]>siz[hson[u]])hson[u] = v;}
}
void Gao(int u, int p)
{int i, v;all[col[u]] += 1;if(all[col[u]]>bet)bet = all[col[u]], sum = 0;if(all[col[u]]>=bet)sum += col[u];for(i=0;i<G[u].size();i++){v = G[u][i];if(v==p || vis[v])continue;Gao(v, u);}
}
void Init(int u, int p)
{int i, v;sum = bet = 0;all[col[u]] = 0;for(i=0;i<G[u].size();i++){v = G[u][i];if(v==p)continue;Init(v, u);}
}
void Sech2(int u, int p)
{int i, v;for(i=0;i<G[u].size();i++){v = G[u][i];if(v==p || hson[u]==v)continue;Sech2(v, u);Init(v, u);}if(hson[u])Sech2(hson[u], u), vis[hson[u]] = 1;Gao(u, p), vis[hson[u]] = 0;ans[u] = sum;
}
int main(void)
{int x, y, n, i;scanf("%d", &n);for(i=1;i<=n;i++)scanf("%d", &col[i]);for(i=1;i<=n-1;i++){scanf("%d%d", &x, &y);G[x].push_back(y);G[y].push_back(x);}Sech1(1, 0);Sech2(1, 0);for(i=1;i<=n;i++)printf("%lld ", ans[i]);puts("");return 0;
}

dsu on tree(Educational Codeforces Round 2: E. Lomsat gelral)相关推荐

  1. 双联通分量求简单环(Educational Codeforces Round 42: F. Simple Cycles Edges)

    题意: n个点m条边的无向图,问有哪些边在一个简单环上,按顺序输出这些边的编号 思路: 对于无向图求出每个双联通分量,对于每个双联通分量,如果点的个数==边的个数,那么这个双联通分量就是个简单环,输出 ...

  2. 1574D The Strongest Build (Educational Codeforces Round 114 (Rated for Div. 2))

    题意 给定n个从小到大的数组,从每个数组中选出一个下标构成一个序列,但是有m种序列被ban了,要求选出的序列对应的数字和最大且没有被ban. 思路 因为有m个序列被ban了,那么最坏的情况可以假设为最 ...

  3. Educational Codeforces Round 114 (Rated for Div. 2) (A ~ F)全题解

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Educational Codeforces Round 114 (Rated for Div. 2) ...

  4. Educational Codeforces Round 106 (Rated for Div. 2)(A ~ E)题解(每日训练 Day.16 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 Educational Codeforces Round 106 (Rated for Div. ...

  5. Educational Codeforces Round 88 (Rated for Div. 2) E(数学)

    Educational Codeforces Round 88 (Rated for Div. 2)E 题目大意: 给你n,k(1<=k<=n<=5e5),从1到n中选k个数组成一个 ...

  6. Educational Codeforces Round 25 G. Tree Queries

    题目链接:Educational Codeforces Round 25 G. Tree Queries 题意: 给你一棵树,一开始所有的点全是黑色,有两种操作. 1 x 将x这个点变为黑色,保证第一 ...

  7. Educational Codeforces Round 61 (Rated for Div. 2)(A、B、C、D、E、F)

    欢迎访问本菜鸡的独立博客:Codecho 比赛名称 Educational Codeforces Round 61 (Rated for Div. 2) 比赛链接 https://codeforces ...

  8. Educational Codeforces Round 123 (Rated for Div. 2)(ABCDE)

    Educational Codeforces Round 123 (Rated for Div. 2)(ABCDE) A. Doors and Keys 题意:给定长度为6的字符串,问是否可以通关,其 ...

  9. Educational Codeforces Round 117 (Rated for Div. 2)题解(A~D)

    Educational Codeforces Round 117 (Rated for Div. 2) 今天这场没打,赛后从九点半到十一点把前面四个题目给补了一下,E题明天有时间看看能不能弄出来. A ...

最新文章

  1. python(1):数据类型/string/list/dict/set等
  2. PHP删除文件unlink
  3. 使用client-go自定义开发Kubernetes
  4. U86650-群鸡乱舞【矩阵乘法】
  5. 渭南师范计算机科学与技术,渭南师范学院计算机科学与技术专业2016年在陕西理科高考录取最低分数线...
  6. Java使用easyExcel操作Excel案例
  7. 使用文本编辑器编写Java源代码
  8. SQL Server各版本官方下载地址
  9. java saxreader 字符串_Java SAXReader.read方法代碼示例
  10. 计算机及网络信息安全管理制度,计算机、网络管理及信息安全管理制度
  11. 2022年首次升级:静态代码测试工具Helix QAC 2022.1 新版本功能快讯
  12. Self-supervised Heterogeneous Graph Neural Network with Co-contrastive Learning
  13. layui 显示饼图_echarts实现饼图绘制
  14. Re5:读论文 TWAG: A Topic-guided Wikipedia Abstract Generator
  15. symbol(唯一)
  16. Node.js 15正式版发布
  17. KSM(Kernel samepage merging)
  18. unity星空银河绚烂天空盒宇宙场景
  19. phpstrom查看代码总行数_PHP统计代码行数的小代码
  20. python修改ppt的字体和颜色_python pptx教程:python 怎么设置ppt图表区的颜色以及给图表区加上边框...

热门文章

  1. python代码写好了怎么运行-python代码是怎样运行的
  2. 大热的麦克风阵列语音识别系统的设计和轻松实现,提供软硬件解决方案
  3. 一种语音控制PPT翻页系统的制作方法
  4. boid模型的Matlab程序,基于Boid模型以及吸引—排斥模型的沙丁鱼集群运动行为模拟...
  5. insert时调用本身字段_java中子类调用父类构造方法注意事项
  6. Vue中computed 计算机属性、getter、setter
  7. 能安装python库的app_APP自动化之安装Python(类库)环境
  8. python中唯一的映射类型是什么_Python基础类型之字典(dict)
  9. 变压器绕组降低邻近效应_高功率UPS性能提升,规格/重量显著降低
  10. android 圆点指示器,ViewPager加上小圆点指示器效果