题目戳我

\(\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. TextBox控件保存上次的输入

    本片文章是参考C# 怎么让winform程序中的输入文本框保留上次的输入再此表示感谢重新在这里写一遍,是为了保存一下,方便自己下次使用可以很快的找到1.设置txtBox控件的配置文件2.选择Text ...

  2. 攻防世界——Misc新手练习区解题总结<2>(5-8题)

    第五题gif: 下载附件后,解压得到这样一个文件 几经寻找无果后,发现是不是可以将gif中的黑白图片看做二进制的数字,进而进行解密 最后用二进制转文本得到flag 第六题掀桌子: 看起来是16进制的密 ...

  3. Java-学习日记(100 == 100为true,1000 == 1000却为false?)

    Integer底层设计 100 == 100为true,1000 == 1000却为false? 之前也写过String的==与equals的注意点,这次写下Integer的底层设计,不妨先运行下下面 ...

  4. P4719 【模板】"动态 DP"&动态树分治

    题目描述 给定一棵 n 个点的树,点带点权. 有 m 次操作,每次操作给定 x,y,表示修改点 x 的权值为 y. 你需要在每次操作之后求出这棵树的最大权独立集的权值大小. 输入格式 第一行有两个整数 ...

  5. 目标识别AI资料

    朋友推荐的, 还有自己搜的. 入门可以看看. 网上资料应该不少, 一搜一大把, 简单记下地址. Review of Deep Learning Algorithms for Object Detect ...

  6. IIS上传文件最大限制问题

    IIS服务器文件最大限制默认是30M. 自定义方法:修改配置文件,路径是:C:\Windows\System32\inetsrv\Config\applicationHost.config 在requ ...

  7. kali命令大全

    arch 显示机器的处理器架构(1)uname -m 显示机器的处理器架构(2)uname -r 显示正在使用的内核版本dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI)hd ...

  8. 再深入一点|binlog和relay-log到底长啥样?

    上一篇mysql面试的文章之后收到不少朋友的意见,希望深入讲讲复制.日志的格式这些,今天,我们就来深挖一下mysql的复制机制到底有哪一些,以及binlog和relay-log的结构到底是什么样子的. ...

  9. hacker101 CTF 学习记录(二)

    前言 无 Easy-Postbook 拿到功能有点多,先扫一遍目录 .Ds_Store没有啥东西,page是个静态页面 随便注册个账号,登录后已经有2篇文章,第一篇文章的id是1 自己创建文章,将ur ...

  10. Django进入监听端口就自动打开指定页面,无需导航栏手动添加(Django六)

    在我们进入监听端口时画面如下:而因为在urls.py中写过如下语句 我们在监听端口后加上/login就会跳转到login.html页面,如下图 那么如何一打开监听端口就可以走动跳转到login.htm ...