dsu on tree(Educational Codeforces Round 2: E. Lomsat gelral)
题意:
一棵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)相关推荐
- 双联通分量求简单环(Educational Codeforces Round 42: F. Simple Cycles Edges)
题意: n个点m条边的无向图,问有哪些边在一个简单环上,按顺序输出这些边的编号 思路: 对于无向图求出每个双联通分量,对于每个双联通分量,如果点的个数==边的个数,那么这个双联通分量就是个简单环,输出 ...
- 1574D The Strongest Build (Educational Codeforces Round 114 (Rated for Div. 2))
题意 给定n个从小到大的数组,从每个数组中选出一个下标构成一个序列,但是有m种序列被ban了,要求选出的序列对应的数字和最大且没有被ban. 思路 因为有m个序列被ban了,那么最坏的情况可以假设为最 ...
- Educational Codeforces Round 114 (Rated for Div. 2) (A ~ F)全题解
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Educational Codeforces Round 114 (Rated for Div. 2) ...
- Educational Codeforces Round 106 (Rated for Div. 2)(A ~ E)题解(每日训练 Day.16 )
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 Educational Codeforces Round 106 (Rated for Div. ...
- 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个数组成一个 ...
- Educational Codeforces Round 25 G. Tree Queries
题目链接:Educational Codeforces Round 25 G. Tree Queries 题意: 给你一棵树,一开始所有的点全是黑色,有两种操作. 1 x 将x这个点变为黑色,保证第一 ...
- 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 ...
- Educational Codeforces Round 123 (Rated for Div. 2)(ABCDE)
Educational Codeforces Round 123 (Rated for Div. 2)(ABCDE) A. Doors and Keys 题意:给定长度为6的字符串,问是否可以通关,其 ...
- Educational Codeforces Round 117 (Rated for Div. 2)题解(A~D)
Educational Codeforces Round 117 (Rated for Div. 2) 今天这场没打,赛后从九点半到十一点把前面四个题目给补了一下,E题明天有时间看看能不能弄出来. A ...
最新文章
- python(1):数据类型/string/list/dict/set等
- PHP删除文件unlink
- 使用client-go自定义开发Kubernetes
- U86650-群鸡乱舞【矩阵乘法】
- 渭南师范计算机科学与技术,渭南师范学院计算机科学与技术专业2016年在陕西理科高考录取最低分数线...
- Java使用easyExcel操作Excel案例
- 使用文本编辑器编写Java源代码
- SQL Server各版本官方下载地址
- java saxreader 字符串_Java SAXReader.read方法代碼示例
- 计算机及网络信息安全管理制度,计算机、网络管理及信息安全管理制度
- 2022年首次升级:静态代码测试工具Helix QAC 2022.1 新版本功能快讯
- Self-supervised Heterogeneous Graph Neural Network with Co-contrastive Learning
- layui 显示饼图_echarts实现饼图绘制
- Re5:读论文 TWAG: A Topic-guided Wikipedia Abstract Generator
- symbol(唯一)
- Node.js 15正式版发布
- KSM(Kernel samepage merging)
- unity星空银河绚烂天空盒宇宙场景
- phpstrom查看代码总行数_PHP统计代码行数的小代码
- python修改ppt的字体和颜色_python pptx教程:python 怎么设置ppt图表区的颜色以及给图表区加上边框...
热门文章
- python代码写好了怎么运行-python代码是怎样运行的
- 大热的麦克风阵列语音识别系统的设计和轻松实现,提供软硬件解决方案
- 一种语音控制PPT翻页系统的制作方法
- boid模型的Matlab程序,基于Boid模型以及吸引—排斥模型的沙丁鱼集群运动行为模拟...
- insert时调用本身字段_java中子类调用父类构造方法注意事项
- Vue中computed 计算机属性、getter、setter
- 能安装python库的app_APP自动化之安装Python(类库)环境
- python中唯一的映射类型是什么_Python基础类型之字典(dict)
- 变压器绕组降低邻近效应_高功率UPS性能提升,规格/重量显著降低
- android 圆点指示器,ViewPager加上小圆点指示器效果