题目戳我

\(\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的更多相关文章

  1. 树上启发式合并(dsu on tree)学习笔记

    有丶难,学到自闭 参考的文章: zcysky:[学习笔记]dsu on tree Arpa:[Tutorial] Sack (dsu on tree) 先康一康模板题吧:CF 600E($Lomsat ...

  2. dsu on tree 树上启发式合并 学习笔记

    近几天跟着dreagonm大佬学习了\(dsu\ on\ tree\),来总结一下: \(dsu\ on\ tree\),也就是树上启发式合并,是用来处理一类离线的树上询问问题(比如子树内的颜色种数) ...

  3. dsu on tree[树上启发式合并学习笔记]

    dsu on tree 本质上是一个 启发式合并 复杂度 \(O(n\log n)\) 不支持修改 只能支持子树统计 不能支持链上统计- 先跑一遍树剖的dfs1 搞出来轻重儿子- 求每个节点的子树上有 ...

  4. 【CF600E】Lomset gelral 题解(树上启发式合并)

    题目链接 题目大意:给出一颗含有$n$个结点的树,每个节点有一个颜色.求树中每个子树最多的颜色的编号和. ------------------------- 树上启发式合并(dsu on tree). ...

  5. CF EDU - E. Lomsat gelral 树上启发式合并

    学习:http://codeforces.com/blog/entry/44351 E. Lomsat gelral 题意: 给定一个以1为根节点的树,每个节点都有一个颜色,问每个节点的子树中,颜色最 ...

  6. Codeforces 600E - Lomsat gelral(树上启发式合并)

    600E - Lomsat gelral 题意 给出一颗以 1 为根的树,每个点有颜色,如果某个子树上某个颜色出现的次数最多,则认为它在这课子树有支配地位,一颗子树上,可能有多个有支配的地位的颜色,对 ...

  7. [Codeforces600E] Lomsat gelral(树上启发式合并)

    [Codeforces600E] Lomsat gelral(树上启发式合并) 题面 给出一棵N个点的树,求其所有子树内出现次数最多的颜色编号和.如果多种颜色出现次数相同,那么编号都要算进答案 N≤1 ...

  8. 神奇的树上启发式合并 (dsu on tree)

    参考资料 https://www.cnblogs.com/zhoushuyu/p/9069164.html https://www.cnblogs.com/candy99/p/dsuontree.ht ...

  9. dsu on tree (树上启发式合并) 详解

    一直都没出过算法详解,昨天心血来潮想写一篇,于是 dsu on tree 它来了 1.前置技能 1.链式前向星(vector 建图) 2.dfs 建树 3.剖分轻重链,轻重儿子 重儿子 一个结点的所有 ...

随机推荐

  1. android开发之splash闪屏页判断是否第一次进入app代码

    package com.david.david.zhankudemo.activity; import android.app.Activity; import android.content.Con ...

  2. cg语言学习&&阳春白雪GPU编程入门学习

    虽然所知甚少,但康大的<GPU编程与Cg编程之阳春白雪下里巴人>确实带我入了shader的门,在里面我第一次清晰地知道了“语义”的意思,非常感谢. 入门shader,我觉得可以先读3本书: ...

  3. Google Code Jam 2020 Round1B Expogo

    题意 你初始位于\((0,0)\),然后你想要到\((x,y)\)去,第\(i\)步的步长是\(2^{i-1}\),要求用最少的步数走到\((x,y)\). 解题思路 首先可以推出,走\(i\)步可以 ...

  4. 编程体系结构(02):Java异常体系

    本文源码:GitHub·点这里 || GitEE·点这里 一.异常简介 优秀的程序代码,都在追求高效,安全,和低错误率,但是程序中的异常是无法避免的,降低异常出现的频率是关键,异常出现如何处理是另一个 ...

  5. 转贴:修改springboot控制台输出的图案

    Post from:https://blog.csdn.net/WXN069/article/details/90667668 修改springboot控制台输出的图案1.在src\main\reso ...

  6. 业务级别MySQL

    业务级别MySQL 目录 业务级别MySQL 1. 权限管理和备份 1. 用户管理 1. SQLyog可视化操作 2. SQL命令操作 2. MySQL备份 3. 规范数据库设计 1. 为什么需要设计 ...

  7. 恭喜!Apache Hudi社区新晋多位Committer

    1. 介绍 经过Apache Hudi项目委员会讨论及投票,向Udit Mehrotra.Gary Li.Raymond Xu.Pratyaksh Sharma 4人发出Committer邀请,4人均 ...

  8. sql注入 --显错注入

    前提知识 数据库:就是将大量数据把保存起来,通过计算机加工而成的可以高效访问数据库的数据集合数据库结构:库:就是一堆表组成的数据集合表:类似 Excel,由行和列组成的二维表字段:表中的列称为字段记录 ...

  9. MIPS 架构流水线处理器

    该项目系笔者大二时计算机组成课的课程设计,源代码及完整文档请移步 Github 仓库.

  10. OneNote代码高亮完美解决方案(全网最全)

    0. 引子 OneNote作为一款记笔记的软件,免费实用,有助于自己形成树状结构知识框架.但是它有一个令人头疼的问题就是:无法代码高亮.而NoteHightlight2016正是解决这个问题的完美利器 ...