【学习笔记/题解】树上启发式合并/CF600E Lomsat gelral
\(\text{Solution:}\)
树上启发式合并,是对普通暴力的一种优化。
考虑本题,最暴力的做法显然是暴力统计每一次的子树,为了避免其他子树影响,每次统计完子树都需要清空其信息。
但是,如果我们先对非\(x\)的节点进行统计,最后统计\(x\)然后合并其他节点的信息,那么,\(x\)的统计信息就没有必要被删掉。
那么显然地,\(x\)的子树越大越好。
于是,自然想到轻重链剖分,并将\(x\)设置为其重儿子。于是,算法模型如下:
对所有非重儿子进行统计并清空其所记录的统计信息。
对重儿子进行统计并保留其信息。
暴力将其他儿子的信息合并到重儿子上,得到当前子树的信息。
根据树链剖分的性质,一个点到根的路径上的轻边条数不超过\(\log n\)条,而一个节点只有其祖先遇到轻边的时候才会被统计一次。
所以复杂度为\(O(n\log n).\)
关于这题 直接安装上述算法流程进行暴力统计即可。
关于一点对树剖性质的证明:每次经过一条轻边,其子树大小最少会变成原来的一半,所以轻边条数是\(O(\log n)\)的。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=3e5+10;
typedef long long ll;
int son[MAXN],head[MAXN],n,tot,siz[MAXN];
int vis[MAXN],cnt[MAXN],col[MAXN],Mx,Son;
vector<int>v[MAXN];
ll sum,ans[MAXN];
void dfs(int x,int fa){
siz[x]=1;
for(int i=0;i<v[x].size();++i){
int j=v[x][i];
if(j==fa)continue;
dfs(j,x);siz[x]+=siz[j];
if(siz[j]>siz[son[x]])son[x]=j;
}
}
void add(int x,int fa,int val){
cnt[col[x]]+=val;
if(cnt[col[x]]>Mx)Mx=cnt[col[x]],sum=col[x];
else if(cnt[col[x]]==Mx)sum+=col[x]*1ll;
for(int i=0;i<v[x].size();++i){
int j=v[x][i];
if(j==fa||j==Son)continue;
add(j,x,val);
}
}
void dfs2(int x,int fa,int opt){
for(int i=0;i<v[x].size();++i){
int j=v[x][i];
if(j==fa)continue;
if(j!=son[x])dfs2(j,x,0);
}
if(son[x])dfs2(son[x],x,1),Son=son[x];
add(x,fa,1);Son=0;
ans[x]=sum;
if(!opt)add(x,fa,-1),sum=Mx=0;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i)scanf("%d",col+i);
for(int i=1;i<n;++i){
int x,y;
scanf("%d%d",&x,&y);
v[x].push_back(y);v[y].push_back(x);
}
dfs(1,0);dfs2(1,0,0);
for(int i=1;i<=n;++i)printf("%I64d ",ans[i]);
puts("");
return 0;
}
【学习笔记/题解】树上启发式合并/CF600E Lomsat gelral的更多相关文章
- 树上启发式合并(dsu on tree)学习笔记
有丶难,学到自闭 参考的文章: zcysky:[学习笔记]dsu on tree Arpa:[Tutorial] Sack (dsu on tree) 先康一康模板题吧:CF 600E($Lomsat ...
- dsu on tree 树上启发式合并 学习笔记
近几天跟着dreagonm大佬学习了\(dsu\ on\ tree\),来总结一下: \(dsu\ on\ tree\),也就是树上启发式合并,是用来处理一类离线的树上询问问题(比如子树内的颜色种数) ...
- dsu on tree[树上启发式合并学习笔记]
dsu on tree 本质上是一个 启发式合并 复杂度 \(O(n\log n)\) 不支持修改 只能支持子树统计 不能支持链上统计- 先跑一遍树剖的dfs1 搞出来轻重儿子- 求每个节点的子树上有 ...
- 【CF600E】Lomset gelral 题解(树上启发式合并)
题目链接 题目大意:给出一颗含有$n$个结点的树,每个节点有一个颜色.求树中每个子树最多的颜色的编号和. ------------------------- 树上启发式合并(dsu on tree). ...
- CF EDU - E. Lomsat gelral 树上启发式合并
学习:http://codeforces.com/blog/entry/44351 E. Lomsat gelral 题意: 给定一个以1为根节点的树,每个节点都有一个颜色,问每个节点的子树中,颜色最 ...
- Codeforces 600E - Lomsat gelral(树上启发式合并)
600E - Lomsat gelral 题意 给出一颗以 1 为根的树,每个点有颜色,如果某个子树上某个颜色出现的次数最多,则认为它在这课子树有支配地位,一颗子树上,可能有多个有支配的地位的颜色,对 ...
- [Codeforces600E] Lomsat gelral(树上启发式合并)
[Codeforces600E] Lomsat gelral(树上启发式合并) 题面 给出一棵N个点的树,求其所有子树内出现次数最多的颜色编号和.如果多种颜色出现次数相同,那么编号都要算进答案 N≤1 ...
- 神奇的树上启发式合并 (dsu on tree)
参考资料 https://www.cnblogs.com/zhoushuyu/p/9069164.html https://www.cnblogs.com/candy99/p/dsuontree.ht ...
- dsu on tree (树上启发式合并) 详解
一直都没出过算法详解,昨天心血来潮想写一篇,于是 dsu on tree 它来了 1.前置技能 1.链式前向星(vector 建图) 2.dfs 建树 3.剖分轻重链,轻重儿子 重儿子 一个结点的所有 ...
随机推荐
- Labview学习之路(一)程序框图中的修饰
很多小伙伴知道在前面板有很多修饰符,比如上凸框,加粗下凹框等等,但是其实在程序框图中也是有修饰符的,他的位置比较隐蔽,并且修饰符很少,所以很多人基本没有用过.现在就给大家介绍一些这些程序框图种的修饰. ...
- 发生错误 1069 sqlserver
---------------------------SQL Server 服务管理器---------------------------发生错误 1069 - (由于登录失败而无法启动服务.),此 ...
- Left Mouse Button (bfs)
Mine sweeper is a very popular small game in Windows operating system. The object of the game is to ...
- 学会BeanShell,才敢说自己懂Jmeter
jmeter的BeanShell Sampler,可以直接引用java代码,有下面3种方式: 1.直接输入java代码 2.导入java文件 3.导入class文件 BeanShell脚本访问变量主要 ...
- .net core3.1中实现简单的jwt认证
1.创建项目 使用visual studio创建一个名为JwtDemo的空项目,创建后如图 2.添加依赖项 在nuget包管理器中搜索 Microsoft.AspNetCore.Authenticat ...
- 如何解决SpringBoot工程中的错误:java.sql.SQLNonTransientConnectionException: CLIENT_PLUGIN_AUTH is required
出错原因:MySQL依赖及MySQL驱动包高于在使用的MySQL数据库版本. 比如,我本地数据库版本是:Server version: 5.2.3-falcon-alpha-community-nt ...
- vue3剖析:响应式原理——effect
响应式原理 源码目录:https://github.com/vuejs/vue-next/tree/master/packages/reactivity 模块 ref: reactive: compu ...
- React和Vue的异同
Vue和React是时下比较受欢迎的三巨头之二,对Angular不慎了解,就不在赘述. React是由Facebook开发的一个js ui框架,其最大的变化就是VirtualDOM和新语法JSX vu ...
- 动手编写—动态数组(Java实现)
目录 数组基础回顾 自定义动态数组 动态数组的设计 抽象父类接口设计 抽象父类设计 动态数组之DynamicArray 补充数组缩容 全局的关系图 声明 数组基础回顾 1.数组是一种常见的数据结构,用 ...
- Docker镜像下载很慢,各种加速无效
mcr.microsoft.com/dotnet/...... 改成: dockerhub.azk8s.cn/dotnet/...... 或 mcr.azk8s.cn/dotnet/......