解题思路

  \(dsu\) \(on\) \(tree\)的模板题。暴力而优雅的算法,轻儿子的信息暴力清空,重儿子的信息保留,时间复杂度\(O(nlogn)\)

代码


#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<set> using namespace std;
const int MAXN = 100005;
typedef long long LL; inline int rd(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) f=ch=='-'?0:1,ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return f?x:-x;
} int n,c[MAXN],head[MAXN],cnt,to[MAXN<<1],nxt[MAXN<<1],num[MAXN],sum[MAXN];
int siz[MAXN],son[MAXN],fa[MAXN],Num;
LL ans[MAXN],Max[MAXN],Ans; inline void add(int bg,int ed){
to[++cnt]=ed,nxt[cnt]=head[bg],head[bg]=cnt;
} inline void update(int x){
sum[num[c[x]]]--;Max[num[c[x]]]-=c[x];
num[c[x]]++;sum[num[c[x]]]++;Max[num[c[x]]]+=c[x];
if(Num<=num[c[x]]) Num=num[c[x]];Ans=Max[Num];
} inline void Clear(int x){
sum[num[c[x]]]--;Max[num[c[x]]]-=c[x];
num[c[x]]--;sum[num[c[x]]]++;Max[num[c[x]]]+=c[x];
if(Num==num[c[x]]+1 && !sum[num[c[x]]+1]) Num=num[c[x]];
Ans=Max[Num];
} void bfs(int x){
update(x);
for(int i=head[x];i;i=nxt[i])
if(to[i]!=fa[x]) bfs(to[i]);
} void clear(int x){
Clear(x);
for(int i=head[x];i;i=nxt[i])
if(to[i]!=fa[x]) clear(to[i]);
} void dfs1(int x,int f){
fa[x]=f;siz[x]=1;int maxson=-1,u;
for(int i=head[x];i;i=nxt[i]){
u=to[i];if(u==f) continue;
dfs1(u,x);siz[x]+=siz[u];
if(siz[u]>maxson) maxson=siz[u],son[x]=u;
}
} void dfs2(int x){
for(int i=head[x];i;i=nxt[i]){
int u=to[i];if(u==fa[x] || u==son[x]) continue;
dfs2(u);clear(u);
}
if(son[x]) dfs2(son[x]);
for(int i=head[x];i;i=nxt[i]){
int u=to[i];if(u==fa[x] || u==son[x]) continue;
bfs(u);
}update(x);
ans[x]=Ans;
} int main(){
n=rd();int x,y;
for(int i=1;i<=n;i++) c[i]=rd();
for(int i=1;i<n;i++){
x=rd(),y=rd();
add(x,y);add(y,x);
}dfs1(1,0);dfs2(1);
for(int i=1;i<=n;i++) printf("%lld ",ans[i]);
return 0;
}

最新文章

  1. Android 手机卫士--导航界面3、4和功能列表界面跳转逻辑处理
  2. hhvm的正确安装姿势 http://dl.hhvm.com 镜像
  3. web iis服务器安全性配置实例
  4. [转]android 获取视频帧
  5. Java多线程--wait(),notify(),notifyAll()的用法
  6. 监听cell 滑动到 摸个分区
  7. [iOS]提交App报错ERROR ITMS -90207
  8. iso定制封装
  9. C++实用数据结构:二叉索引树
  10. 自制单片机之四……LCD1602的驱动
  11. ownCloud Virtual Machines(bitnami.com)
  12. POJ 1703 Find them, Catch them (数据结构-并查集)
  13. 版本控制工具Vault v7.0更新内容曝光【慧都独家】
  14. 详解连接SQL Server数据库的方法,并使用Statement接口实现对数据库的增删改操作
  15. 机器学习 —— 基础整理(七)前馈神经网络的BP反向传播算法步骤整理
  16. java 线程(1)
  17. 慢慢人生路,学点Jakarta基础-JavaDoc标记
  18. [转]Have a query in Blue prism coding stage and collection stage.
  19. IDEA中添加servlet的jar
  20. C++ 的那些坑 (Day 2)

热门文章

  1. font-size-adjust属性定义及用法
  2. POJ 3126 Prime Path (bfs+欧拉线性素数筛)
  3. 「NOI2017」蚯蚓排队 解题报告
  4. ELK Stack 7.1.1之集群搭建
  5. OC学习篇之---对象的拷贝
  6. OC学习篇之---数组对象的引用计数问题和自动释放池的概念
  7. 查看电脑是否安装jdk以及安装了的路径
  8. 微信小程序学习笔记(三)--框架-逻辑层
  9. springmvc缓存 - cache
  10. ajax图片上传,单个按钮实现选择图片和上传