CF 600E. Lomsat gelral(dsu on tree)
解题思路
\(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;
}
												
											CF 600E. Lomsat gelral(dsu on tree)的更多相关文章
- Codeforces.600E.Lomsat gelral(dsu on tree)
		
题目链接 dsu on tree详见这. \(Description\) 给定一棵树.求以每个点为根的子树中,出现次数最多的颜色的和. \(Solution\) dsu on tree模板题. 用\( ...
 - Codeforces 600E. Lomsat gelral(Dsu on tree学习)
		
题目链接:http://codeforces.com/problemset/problem/600/E n个点的有根树,以1为根,每个点有一种颜色.我们称一种颜色占领了一个子树当且仅当没有其他颜色在这 ...
 - 【CodeForces】600 E. Lomsat gelral (dsu on tree)
		
[题目]E. Lomsat gelral [题意]给定n个点的树,1为根,每个点有一种颜色ci,一种颜色占领一棵子树当且仅当子树内没有颜色的出现次数超过它,求n个答案——每棵子树的占领颜色的编号和Σc ...
 - cf600E. Lomsat gelral(dsu on tree)
		
题意 题目链接 给出一个树,求出每个节点的子树中出现次数最多的颜色的编号和 Sol dsu on tree的裸题. 一会儿好好总结总结qwq #include<bits/stdc++.h> ...
 - codeforces600E. Lomsat gelral(dsu on tree)
		
dsu on tree先分轻重儿子先处理轻边,再处理重儿子再加上轻儿子的答案 #include<iostream> #include<cstdio> #include<q ...
 - 【Codeforces】600E. Lomsat gelral
		
Codeforces 600E. Lomsat gelral 学习了一下dsu on tree 所以为啥是dsu而不是dfs on tree??? 这道题先把这棵树轻重链剖分了,然后先处理轻儿子,处理 ...
 - Codeforces 600E - Lomsat gelral(树上启发式合并)
		
600E - Lomsat gelral 题意 给出一颗以 1 为根的树,每个点有颜色,如果某个子树上某个颜色出现的次数最多,则认为它在这课子树有支配地位,一颗子树上,可能有多个有支配的地位的颜色,对 ...
 - Codeforces 600E Lomsat gelral(dsu on tree)
		
dsu on tree板子题.这个trick保证均摊O(nlogn)的复杂度,要求资瓷O(1)将一个元素插入集合,清空集合时每个元素O(1)删除.(当然log的话就变成log^2了) 具体的,每次先遍 ...
 - Codeforces 600E - Lomsat gelral 「$Dsu \ on \ tree$模板」
		
With $Dsu \ on \ tree$ we can answer queries of this type: How many vertices in the subtree of verte ...
 
随机推荐
- 【LeetCode 38】报数
			
题目链接 [题解] 模拟题 [代码] class Solution { public: string inttostr(int x){ string temp=""; while ...
 - shell从字符串中提取子串(正则表达式)
			
通过试验,可以通过grep.sed两种方式实现. 假设需要提取libgcc-4.8.5-4.h5.x86_64.rpm中的版本号. grep echo "libgcc-4.8.5-4.h5. ...
 - JS-动态加载
			
var s = document.createElement('script'); s.setAttribute('src', ''); s.setAttribute('type', 'text/ja ...
 - Linux应急响应基础
			
文件排查 敏感目录文件分析 tmp目录 命令目录 /usr/bin /usr/sbin 开机启动项 /etc/init.d /etc/init.d是/etc/rc.d/init.d的软链接 文件时间 ...
 - win10 虚拟机VMware 14中CentOS7文件共享
			
一,环境 主机:win10 家庭版 软件:VMware 14 系统:CentOS 7 二,设置共享文件 右键虚拟机->选择设置 如图:创建共享文件 三,安装VMware Tools 然后进入ce ...
 - Ubuntu apt-get 更新/查看软件
			
ubuntu 升级软件: sudo apt-get update 更新源 sudo apt-get upgrade 更新已安装的包 sudo apt-get dist-upgrade 升级系统 ubu ...
 - 粗糙的区别prepareStatement:(为Statement的子类)与Statement
			
区别: prepareStatement:(为Statement的子类) conn = DBFactory.getInstance().getImpl().getConnection(); //方式一 ...
 - koa2实现登录注册功能(ejs+mongodb版)
			
gtihub仓库地址:(由于国内处于敏感时期,github暂时无法访问) 主要使用的中间件: "ejs": "^2.7.1",(渲染模板) "koa& ...
 - 当vue页面异步加载的数据想在页面上渲染怎么办
			
<template> <div class="test"> <div v-for="(item, index) in arr" : ...
 - 【记录】linux 常用命令梳理
			
命令梳理 下载文件 [wget 是一个十分常用命令行下载工具,多数Linux发行版本都默认包含这个工具] wget -c [zip路径等] #断点续传,如果下载中断,那么连接恢复时会从上次断点开始下载 ...