题目戳我

\(\text{Solution:}\)

树上启发式合并,是对普通暴力的一种优化。

考虑本题,最暴力的做法显然是暴力统计每一次的子树,为了避免其他子树影响,每次统计完子树都需要清空其信息。

但是,如果我们先对非\(x\)的节点进行统计,最后统计\(x\)然后合并其他节点的信息,那么,\(x\)的统计信息就没有必要被删掉。

那么显然地,\(x\)的子树越大越好。

于是,自然想到轻重链剖分,并将\(x\)设置为其重儿子。于是,算法模型如下:

  • 对所有非重儿子进行统计并清空其所记录的统计信息。

  • 对重儿子进行统计并保留其信息。

  • 暴力将其他儿子的信息合并到重儿子上,得到当前子树的信息。

根据树链剖分的性质,一个点到根的路径上的轻边条数不超过\(\log n\)条,而一个节点只有其祖先遇到轻边的时候才会被统计一次。

所以复杂度为\(O(n\log n).\)

关于这题 直接安装上述算法流程进行暴力统计即可。

关于一点对树剖性质的证明:每次经过一条轻边,其子树大小最少会变成原来的一半,所以轻边条数是\(O(\log n)\)的。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int MAXN=3e5+10;
  4. typedef long long ll;
  5. int son[MAXN],head[MAXN],n,tot,siz[MAXN];
  6. int vis[MAXN],cnt[MAXN],col[MAXN],Mx,Son;
  7. vector<int>v[MAXN];
  8. ll sum,ans[MAXN];
  9. void dfs(int x,int fa){
  10. siz[x]=1;
  11. for(int i=0;i<v[x].size();++i){
  12. int j=v[x][i];
  13. if(j==fa)continue;
  14. dfs(j,x);siz[x]+=siz[j];
  15. if(siz[j]>siz[son[x]])son[x]=j;
  16. }
  17. }
  18. void add(int x,int fa,int val){
  19. cnt[col[x]]+=val;
  20. if(cnt[col[x]]>Mx)Mx=cnt[col[x]],sum=col[x];
  21. else if(cnt[col[x]]==Mx)sum+=col[x]*1ll;
  22. for(int i=0;i<v[x].size();++i){
  23. int j=v[x][i];
  24. if(j==fa||j==Son)continue;
  25. add(j,x,val);
  26. }
  27. }
  28. void dfs2(int x,int fa,int opt){
  29. for(int i=0;i<v[x].size();++i){
  30. int j=v[x][i];
  31. if(j==fa)continue;
  32. if(j!=son[x])dfs2(j,x,0);
  33. }
  34. if(son[x])dfs2(son[x],x,1),Son=son[x];
  35. add(x,fa,1);Son=0;
  36. ans[x]=sum;
  37. if(!opt)add(x,fa,-1),sum=Mx=0;
  38. }
  39. int main(){
  40. scanf("%d",&n);
  41. for(int i=1;i<=n;++i)scanf("%d",col+i);
  42. for(int i=1;i<n;++i){
  43. int x,y;
  44. scanf("%d%d",&x,&y);
  45. v[x].push_back(y);v[y].push_back(x);
  46. }
  47. dfs(1,0);dfs2(1,0,0);
  48. for(int i=1;i<=n;++i)printf("%I64d ",ans[i]);
  49. puts("");
  50. return 0;
  51. }

【学习笔记/题解】树上启发式合并/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. 利用 Python 写个七夕表白神器

    今天是七夕节,相比于现代人自创的 502,不对是 520,七夕才是中国传统意义上的情人节,本文分享几个 Python 表白程序,情侣可以现学现用,单身的话也可以先收藏一下,说不定下次就用上了. 很多人 ...

  2. 关于idea中SpringBoot启动失败的坑

    很多时候你新建了Maven 或者SpringBoot 工程,激动的点了主启动类,你就发现了下面的错误 Error starting Tomcat context. Exception: org.spr ...

  3. facebookPixel代码安装详解

    最近接到一个需求,优化独立站的facebookPixel代码,完成后对这个项目进行复盘.首先要介绍facebookPixel的理论知识. Facebook像素是一段JavaScript代码,其中加载了 ...

  4. Cypress系列(44)- 命令行运行 Cypress

    如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html 前言 前面也介绍过 Cypress 命令 ...

  5. XmlAnalyzer1.00 源码

    此工程用途:将xml同级属性/子节点按字母序排列重新输出. 源码下载: https://files.cnblogs.com/files/heyang78/XmlAnalyzer-20200526-1. ...

  6. Hint usenl usage /*+ leading(emp,dept) usenl(emp) */

    SQL> select /*+ leading(emp,dept) usenl(emp) */ emp.*,dept.* from tb_emp03 emp,tb_dept03 dept whe ...

  7. LC算法技巧总结(二):双指针和滑动窗口技巧

    我把双指针技巧再分为两类,一类是「快慢指针」,一类是「左右指针」.前者解决主要解决链表中的问题,比如典型的判定链表中是否包含环:后者主要解决数组(或者字符串)中的问题,比如二分查找. 一.快慢指针的常 ...

  8. html基础:DOM操作

    DOM(Document Object Model 文档对象模型) 一个web页面被封装成一个dom对象,通过dom中的js对页面的标签进行操作 一.获取对象 浏览器页面上右键--检查--consol ...

  9. [极客大挑战 2019]Havefun wp

    很少见的很简单的一道题 查看源代码 获得一段被注释的代码 直接?cat=dog即可得flag

  10. [SpringBoot项目]问题及解决总结

    问题:MySQL 8.0版本连接报错:Could not create connection to database server 原因 MySQL8.0版本需要更换驱动为"com.mysq ...