大意是每个点有一个颜色,询问以每个点为根的子树中出现次数最多的颜色是谁,如果有多个输出编号和。

这个东西用数据结构是不太好做的,考虑优化暴力。

首先最裸的的暴力就是在dfs序上跑莫队,但因为是树的结构所以有更优美的暴力。

参考的博客:http://www.cnblogs.com/candy99/p/dsuontree.html

类似树上启发式合并,叫做dsu on tree。

0.首先轻重链剖分。

1.然后先处理轻儿子,处理完把贡献删除。

2.处理重儿子,保留贡献。

3.把轻儿子的贡献再加上。

4.算这个点的答案。

5.如果这个点是轻儿子就把数组里的东西清空。

因为每个点到根只有$log$条轻链,所以在执行3和5时每个点最多加入删除$log$次。

复杂度$nlogn$

#include<bits/stdc++.h>
#define ll long long
#define N 100005
using namespace std;
int v[N],head[N],ver[N*2],nxt[N*2],tot;
void add(int a,int b)
{tot++;nxt[tot]=head[a];head[a]=tot;ver[tot]=b;return;
}
int n,size[N],son[N];
void dfs(int x,int f)
{size[x]=1;for(int i=head[x];i;i=nxt[i]){if(ver[i]==f)continue;dfs(ver[i],x);size[x]+=size[ver[i]];if(size[ver[i]]>size[son[x]])son[x]=ver[i];}
}
int cnt[N];
ll sum[N],ans[N];
int mx;
void ds(int x,int f,int z)
{sum[cnt[v[x]]]-=v[x];cnt[v[x]]+=z;sum[cnt[v[x]]]+=v[x];if(cnt[v[x]]>mx)mx=cnt[v[x]];else if(sum[mx]==0)mx--;for(int i=head[x];i;i=nxt[i]){if(ver[i]==f)continue;ds(ver[i],x,z);}
}
void dffs(int x,int f,int op)
{for(int i=head[x];i;i=nxt[i]){if(ver[i]==f||ver[i]==son[x])continue;dffs(ver[i],x,0);}if(son[x])dffs(son[x],x,1);sum[cnt[v[x]]]-=v[x];cnt[v[x]]++;sum[cnt[v[x]]]+=v[x];if(cnt[v[x]]>mx)mx=cnt[v[x]];for(int i=head[x];i;i=nxt[i]){if(ver[i]==f||ver[i]==son[x])continue;ds(ver[i],x,1);}ans[x]=sum[mx];if(!op)ds(x,f,-1);
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&v[i]);int t1,t2;for(int i=1;i<n;i++){scanf("%d%d",&t1,&t2);add(t1,t2);add(t2,t1);}dfs(1,-1);dffs(1,-1,0);for(int i=1;i<=n;i++){printf("%I64d ",ans[i]);}return 0;
}

  

转载于:https://www.cnblogs.com/ezyzy/p/7045169.html

[Coderforces600E] Lomsat gelral相关推荐

  1. Lomsat gelral

    cf600E. Lomsat gelral 题意:给出一个树,求出每个节点的子树中出现次数最多的颜色的编号和 板子题 #include<iostream> #include<cstd ...

  2. cf600 E. Lomsat gelral

    cf600 E. Lomsat gelral 题意: 给出一个树,求出每个节点的子树中出现次数最多的颜色的编号和 题解: 树上启发式合并 树上启发式合并讲解 其实就是:递归轻儿子,消除影响,递归重儿子 ...

  3. 数据结构之线段树合并——永无乡,Lomsat gelral,Tree Rotations,Tree Rotations Escape Through Leaf

    文章目录 [HNOI2012]永无乡 Lomsat gelral 「POI2011 R2 Day2」旋转树木 Tree Rotations Escape Through Leaf 线段树合并与 fhq ...

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

    题目链接 Lomsat gelral 占坑--等深入理解了再来补题解-- #include <bits/stdc++.h>using namespace std;#define rep(i ...

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

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

  6. 【算法讲20:Dsu on Tree】树上数颜色 | Lomsat gelral

    [算法讲20:Dsu on Tree] [例一:树上数颜色] · 暴力做法 · · 考虑优化 · ⌈ D s u o n T r e e ⌋ \lceil Dsu\ on\ Tree\rfloor ⌈ ...

  7. [CF600] E. Lomsat gelral ( 经典树上启发式合并 dus on tree )

    题目链接:E. Lomsat gelral 题解 经典树上启发式合并的题目,按照正常暴力求时间复杂度为O(n2){O(n^2)}O(n2),很明显是有问题的.那么树上启发式合并是如何做的呢. 先说一些 ...

  8. dsu on tree 模板题目(CF600E Lomsat gelral)

    题解: dsu on tree 对于结点i来说,步骤为: 递归轻儿子,不保留贡献. 递归重儿子,保留贡献. 统计当前结点及所有轻儿子的贡献. 拿个样例来解释算法的流程 比如说样例2: 如图所示,有多个 ...

  9. CodeForces - 600E Lomsat gelral(树上启发式合并)

    题目链接:点击查看 题目大意:给出一棵树,每个节点都有一个编号代表一种颜色,现在对于每个子树求出现最多的颜色的编号之和 题目分析:因为n给到了1e5,看完这个题第一反应就是暴力n*n,但显然是会超时的 ...

最新文章

  1. 几个经典的TCP通信函数
  2. 媒体洞察 | 让企业自由发展的云时代
  3. 【MM模块】Variances without ref to an item 容差设置
  4. 【Linux高级驱动】如何分析并移植网卡驱动
  5. OLAP组件-Clickhouse源码
  6. java第五章课后题_黑猴子的家:Java SE 练习题第五章
  7. HDU 漫步校园 (记忆化搜索)
  8. python美女源代码_单身程序员,每晚用python抓取百万张美女图片,连女友都不想找了...
  9. (2)评价算法-TOPSIS算法
  10. 桌面计算机主流硬盘接口,M.2和U.2谁更好?主流硬盘接口大扫盲
  11. 计算机科学二审需要多久,寒冬展风采,文体两开花——记计算机科学学院迎新晚会节目二审暨素美部“计体两开花”品牌活动...
  12. html5 今日头条视频播放,今日头条app设置自动播放视频的方法
  13. Kivy教程之 08 倒计时App实现timer调用(教程含源码)
  14. QT中的setAttribute()用法
  15. 数据结构与算法常见笔试题
  16. 让WINDOWS XP自动登陆
  17. 2021下半年系统集成项目管理师客观题参考答题解析(3)
  18. 反常积分(Anomalous Integrals)
  19. 极光推送:后台向APP:android,ios极光推送消息
  20. Papervision3D拖动物体

热门文章

  1. Windows完成端口的理解
  2. C++ enum 枚举
  3. 阻击恶意软件--清除和保护你的网站的小技巧
  4. 让文本输入框只能输入数字
  5. bat判断文件是否存在_BAT面试必问题系列:JVM判断对象是否已死和四种垃圾回收算法总结...
  6. app中html静态页面缓存,移动端index.html被缓存问题
  7. python asp.net requests_python3使用requests访问asp页面时出错,返回500
  8. 1593: 01串(找规律)
  9. 客户端突如其来的“白屏”等待该如何解决?
  10. 如何打造“智能助理”?阿里对话开发平台这样做