题目链接

戳我

\(Describe\)

给出一棵树,每个节点有一个颜色,求每个节点的子树中颜色数目最多的颜色的和。

\(Solution\)

这道题为什么好多人都写的是启发式合并,表示我不会啊.

这道题不是可以用线段树合并吗?将每个子节点看做一个线段树,维护两个值一个颜色的数目最大值,一个是最大颜色的和,然后不断从儿子向父亲合并即可.

\(Code\)

#include<bits/stdc++.h>
#define int long long
#define rg register
using namespace std;
int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9') f= (c=='-')?-1:1,c=getchar();
while(c>='0'&&c<='9') x=x*10+c-48,c=getchar();
return f*x;
}
struct node {
int to,next;
}a[2000011];
struct node1{
int ch[2],sum,rt,maxx;
}t[2000011];
int head[200011],cnt,x,y,n,c[200011];
void add(int x,int y){
a[++cnt].to=y;
a[cnt].next=head[x];
head[x]=cnt;
}
int b[200011],tot;
void add(int &rt,int l,int r,int c){
rt=++tot;
t[rt].maxx=1,t[rt].sum=c;
if(l==r)
return ;
int mid=(l+r)>>1;
if(c<=mid)
add(t[rt].ch[0],l,mid,c);
else add(t[rt].ch[1],mid+1,r,c);
}
void pushup(int x){
int fx=t[x].ch[0],fy=t[x].ch[1];
if(t[fx].maxx==t[fy].maxx)
t[x].sum=t[fx].sum+t[fy].sum,t[x].maxx=t[fx].maxx;
else if(t[fx].maxx>t[fy].maxx)
t[x].sum=t[fx].sum,t[x].maxx=t[fx].maxx;
else t[x].sum=t[fy].sum,t[x].maxx=t[fy].maxx;
}
int join(int x,int y,int l,int r){
if(!x||!y)
return x+y;
int mid=(l+r)>>1;
if(l==r){
t[x].maxx+=t[y].maxx;
return x;
}
t[x].ch[0]=join(t[x].ch[0],t[y].ch[0],l,mid);
t[x].ch[1]=join(t[x].ch[1],t[y].ch[1],mid+1,r);
pushup(x);
return x;
}
void dfs(int x,int fa){
add(t[x].rt,1,n,b[x]);
for(int i=head[x];i;i=a[i].next){
int v=a[i].to;
if(v==fa)
continue;
dfs(v,x);
t[x].rt=join(t[x].rt,t[v].rt,1,n);
}
c[x]=t[t[x].rt].sum;
}
main(){
n=read();
for(int i=1;i<=n;i++)
b[i]=read();
for(int i=1;i<n;i++)
x=read(),y=read(),add(x,y),add(y,x);
dfs(1,0);
for(int i=1;i<=n;i++)
printf("%I64d ",c[i]);
}

「CF 600E」 Lomsat gelral的更多相关文章

  1. codeforces 600E E. Lomsat gelral (线段树合并)

    codeforces 600E E. Lomsat gelral 传送门:https://codeforces.com/contest/600/problem/E 题意: 给你一颗n个节点的树,树上的 ...

  2. CF 600 E. Lomsat gelral

    E. Lomsat gelral http://codeforces.com/contest/600/problem/E 题意: 求每个子树内出现次数最多的颜色(如果最多的颜色出现次数相同,将颜色编号 ...

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

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

  4. DSU On Tree——Codeforces 600E(E. Lomsat gelral)

    有这么一类问题,要求统计一棵树上与子树相关的某些信息,比如:在一棵所有节点被染色的树上,统计每棵子树上出现次数最多的颜色编号之和. 很自然的可以想到用DFS序+主席树去求解,但是编码复杂度很高: 然后 ...

  5. 「CF600E」Lomsat gelral

    传送门 Luogu 解题思路 线段树合并板子题(也可以 dsu on the tree) 好像没什么好讲的,就是要注意开 long long . 细节注意事项 咕咕咕 参考代码 #include &l ...

  6. Solution -「CF 1342E」Placing Rooks

    \(\mathcal{Description}\)   Link.   在一个 \(n\times n\) 的国际象棋棋盘上摆 \(n\) 个车,求满足: 所有格子都可以被攻击到. 恰好存在 \(k\ ...

  7. CF 600 E Lomsat gelral —— 树上启发式合并

    题目:http://codeforces.com/contest/600/problem/E 看博客:https://blog.csdn.net/blue_kid/article/details/82 ...

  8. 「CF 961G」Partitions

    题目链接 戳我 \(Solution\) 首先,这个直接推式子.自己推去 所以我们来想一想一些巧妙的方法 \(|S|\sum w_i\) 可以转化为:划分好集合后,每个点都对当前点有\(w_i\)的贡 ...

  9. Solution -「CF 1622F」Quadratic Set

    \(\mathscr{Description}\)   Link.   求 \(S\subseteq\{1,2,\dots,n\}\),使得 \(\prod_{i\in S}i\) 是完全平方数,并最 ...

随机推荐

  1. Python Twisted系列教程10:增强defer功能的客户端

    作者:dave@http://krondo.com/an-introduction-to-asynchronous-programming-and-twisted/ 译者:杨晓伟(采用意译) 可以从这 ...

  2. 使用K2时提示未能加载文件或程序集Microsoft.IdentityModel等

    转:http://www.cnblogs.com/dannyli/archive/2012/10/15/2724931.html K2安装成功后,打开workspace管理流程时报错如下图: 未能加载 ...

  3. 前端工作准备-foxmail登陆失败汇总

    foxmail 管理邮箱账号的一个工具软件, 但是在登陆的时候总是遇到明明账号密码没有问题,却总是报错,这里我登陆的时候的集中解决方法总结下: pop和imap 是邮箱的两种协议,大多选imap协议, ...

  4. Hadoop IO基于文件的数据结构详解【列式和行式数据结构的存储策略】

    Charles所有关于hadoop的文章参考自hadoop权威指南第四版预览版 大家可以去safari免费阅读其英文预览版.本人也上传了PDF版本在我的资源中可以免费下载,不需要C币,点击这里下载. ...

  5. RedHat&nbsp;Enterprise&nbsp;Linu…

    Abstract 在嵌入式开发中有宿主机和目标机之分:宿主机是执行编译.链接嵌入式软件的计算机:目标机是运行嵌入式软件的硬件平台. TFTP服务器作为工作于宿主机的软件,主要提供对目标机的主要映像文件 ...

  6. 通过helloworld来认识下backbone

    Backbone主要涉及3部分:model,collection和view.而这个框架的优势在于:数据与视图分离,通过操作model来自动更新view. 根据我的个人经验,直接写个简单的例子是最最直观 ...

  7. PHP内核介绍及扩展开发指南—Extensions 的编写

    Extensions 的编写 理解了这些运行机制以后,本章着手介绍Extensions 的编写,但凡写程序的人都知道hello world,那好,就从hello world开始. 1.1Hello W ...

  8. Servlet和JSP简述

    什么是Servlet和JSP 用Java开发Web应用程序时用到的技术主要有两种,即Servlet和JSP. Servlet是在服务器端执行的Java程序,一个被称为Servlet容器的程序(其实就是 ...

  9. 37.ROUND() 函数

    ROUND() 函数 ROUND 函数用于把数值字段舍入为指定的小数位数. SQL ROUND() 语法 SELECT ROUND(column_name,decimals) FROM table_n ...

  10. python之yield函数

    yield的英文单词意思是生产,刚接触Python的时候感到非常困惑,一直没弄明白yield的用法. 只是粗略的知道yield可以用来为一个函数返回值塞数据,比如下面的例子: def addlist( ...