「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\) 是完全平方数,并最 ...
随机推荐
- Javascript 推荐一个图形化展示库
觉得这个库不错: http://almende.github.io/chap-links-library/index.html
- 如何在windows7中使用“专用字符编辑器”中的字
工具/原料 win7电脑 系统自带的“专用字符编辑器” 系统自带的“字符映射表” 百度经验:jingyan.baidu.com 方法/步骤 1 点击开始→所有程序→附件→系统工具→专用字符编辑器: 步 ...
- Linux - 对文件和目录的权限管理
对文件的权限管理 ls -l,也可以用 ll 命令查看文件权限的相关信息 第一列“-rw-r--r--.”为权限信息,权限信息的最后一个点表示为在安全环境下创建的 第二列“1”为硬链接数,第三列“ro ...
- ndnarry元素处理
元素计算函数 ceil(): 向上最接近的整数,参数是 number 或 array floor(): 向下最接近的整数,参数是 number 或 array rint(): 四舍五入,参数是 num ...
- MIS系统部署方案
- JavaScript语言基础-作用域
- Window setInterval() 方法
Window 对象 转自:https://www.w3cschool.cn/jsref/met-win-setinterval.html 定义和用法 setInterval() 方法可按照指定的周期( ...
- 【转载】C# 从服务器下载文件
支持并尊重原创!原文地址:https://www.cnblogs.com/GoCircle/p/6429136.html 一.//TransmitFile实现下载 protected void But ...
- Leetcode:Longest Palindromic Substring分析和实现
问题大意是在给定字符串中查找最长的回文子串,所谓的回文就是依据中间位置对称的字符串,比如abba,aba都是回文. 这个问题初一看,非常简单,但是会很快发现那些简单的思路都会带来O(n^3)级别的时间 ...
- 回车换行0x0D和0x0A 小谈
在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符.但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符.要是在这 ...