「CF 600E」 Lomsat gelral
题目链接
\(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的更多相关文章
- codeforces 600E E. Lomsat gelral (线段树合并)
codeforces 600E E. Lomsat gelral 传送门:https://codeforces.com/contest/600/problem/E 题意: 给你一颗n个节点的树,树上的 ...
- CF 600 E. Lomsat gelral
E. Lomsat gelral http://codeforces.com/contest/600/problem/E 题意: 求每个子树内出现次数最多的颜色(如果最多的颜色出现次数相同,将颜色编号 ...
- CF EDU - E. Lomsat gelral 树上启发式合并
学习:http://codeforces.com/blog/entry/44351 E. Lomsat gelral 题意: 给定一个以1为根节点的树,每个节点都有一个颜色,问每个节点的子树中,颜色最 ...
- DSU On Tree——Codeforces 600E(E. Lomsat gelral)
有这么一类问题,要求统计一棵树上与子树相关的某些信息,比如:在一棵所有节点被染色的树上,统计每棵子树上出现次数最多的颜色编号之和. 很自然的可以想到用DFS序+主席树去求解,但是编码复杂度很高: 然后 ...
- 「CF600E」Lomsat gelral
传送门 Luogu 解题思路 线段树合并板子题(也可以 dsu on the tree) 好像没什么好讲的,就是要注意开 long long . 细节注意事项 咕咕咕 参考代码 #include &l ...
- Solution -「CF 1342E」Placing Rooks
\(\mathcal{Description}\) Link. 在一个 \(n\times n\) 的国际象棋棋盘上摆 \(n\) 个车,求满足: 所有格子都可以被攻击到. 恰好存在 \(k\ ...
- CF 600 E Lomsat gelral —— 树上启发式合并
题目:http://codeforces.com/contest/600/problem/E 看博客:https://blog.csdn.net/blue_kid/article/details/82 ...
- 「CF 961G」Partitions
题目链接 戳我 \(Solution\) 首先,这个直接推式子.自己推去 所以我们来想一想一些巧妙的方法 \(|S|\sum w_i\) 可以转化为:划分好集合后,每个点都对当前点有\(w_i\)的贡 ...
- Solution -「CF 1622F」Quadratic Set
\(\mathscr{Description}\) Link. 求 \(S\subseteq\{1,2,\dots,n\}\),使得 \(\prod_{i\in S}i\) 是完全平方数,并最 ...
随机推荐
- Nginx启动提示找不到libpcre.so.1解决方法
如果是32位系统 [root@lee ~]# ln -s /usr/local/lib/libpcre.so.1 /lib 如果是64位系统 [root@lee ~]# ln -s /usr/lo ...
- Py修行路 python基础 (三)字典
names=["zhang"]names2=["jack","jie"]names.clear()print(names) #清空整个列表 ...
- 分布式队列 Celery
详情参见: 分布式队列神器 Celery 用户指南(User Guide) 1) Celery-4.1 用户指南: Application(应用) 2) Celery-4.1 用户指南: Task(任 ...
- python‘s tenth day for me
动态参数 *args **kwargs *args 动态参数,万能参数 # args 接受的就是实参对应的 所有位置参数,并将其放在元祖中. def func(*args): pri ...
- 用CSS使图片上下左右都绝对居中于DIV
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- shell编程之sed编辑器&gawk程序
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://twentyfour.blog.51cto.com/945260/560372 s ...
- dom方式解析xml文件的步骤
使用java类即可
- Apache Hive 建表操作的简单描述
客户端连接hive [root@bigdata-02 bin]# ./beeline Beeline version by Apache Hive beeline: Connecting : Ente ...
- ubuntu 编译并安装resin3.1.12+nginx1.2.6
一.先装jdk 先建立如下两个目录: mkdir /usr/lib/jvm mkdir /usr/lib/jvm/java 把jdk-6u26-linux-x64.bin文件传到上面目录下: chmo ...
- Oracle设置主键自增长
第一步:为表设置主键 第二步:新建序列 CREATE SEQUENCE SQ.SEQ_INCREASE START WITH 12 MAXVALUE 999 MINVALUE 0 INCREME ...