[Codeforces600E] Lomsat gelral(树上启发式合并)

题面

给出一棵N个点的树,求其所有子树内出现次数最多的颜色编号和。如果多种颜色出现次数相同,那么编号都要算进答案

N≤100000

分析

树上启发式合并,用map记录颜色出现次数,合并的时候更新最多的出现次数和编号和。

注意合并时的下标问题。当我们merge(x,y)的时候,由于是启发式合并,s[x]可能会并到s[y]去,如果我们直接查询s[x],就查不到真正的答案。所以要再建立一个数组id[x],记录x的map合并之后到了哪里

代码

//树上启发式合并
#include<iostream>
#include<cstdio>
#include<set>
#include<map>
#include<cstring>
#include<vector>
#define maxn 100000
using namespace std;
int n;
int c[maxn+5];
vector<int>E[maxn+5]; int id[maxn+5];
//当我们merge(x,y)的时候,由于是启发式合并,s[x]可能会并到s[y]去
//然后直接查询s[x]就炸了,所以id[x]就是记录x的map合并之后到了哪里
map<int,int>s[maxn+5];
int ans_max[maxn+5];//最多的出现次数
long long ans_cnt[maxn+5];//编号和
long long res[maxn+5];
void merge(int x,int y){
if(s[id[x]].size()<s[id[y]].size()){
swap(id[x],id[y]);
}
int u=id[x],v=id[y];
for(auto it : s[v]){
int val=it.first;
int cnt=it.second;
s[u][val]+=cnt;
if(s[u][val]>ans_max[u]){
ans_max[u]=s[u][val];
ans_cnt[u]=val;
}else if(s[u][val]==ans_max[u]){
ans_cnt[u]+=val;
}
}
} void dfs(int x,int fa){
for(int y : E[x]){
if(y!=fa){
dfs(y,x);
merge(x,y);
}
}
res[x]=ans_cnt[id[x]];
} int main(){
int u,v;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&c[i]);
id[i]=i;
s[i][c[i]]=1;
ans_max[i]=1;
ans_cnt[i]=c[i];
}
for(int i=1;i<n;i++){
scanf("%d %d",&u,&v);
E[u].push_back(v);
E[v].push_back(u);
}
dfs(1,0);
for(int i=1;i<=n;i++){
printf("%I64d ",res[i]);
}
}

[Codeforces600E] Lomsat gelral(树上启发式合并)的更多相关文章

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

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

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

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

  3. CF600E Lomsat gelral 树上启发式合并

    题目描述 有一棵 \(n\) 个结点的以 \(1\) 号结点为根的有根树. 每个结点都有一个颜色,颜色是以编号表示的, \(i\) 号结点的颜色编号为 \(c_i\)​. 如果一种颜色在以 \(x\) ...

  4. 【CF600E】Lomsat gelral——树上启发式合并

    (题面来自luogu) 题意翻译 一棵树有n个结点,每个结点都是一种颜色,每个颜色有一个编号,求树中每个子树的最多的颜色编号的和. ci <= n <= 1e5 裸题.统计时先扫一遍得到出 ...

  5. CodeForces600E Lomsat gelral 线段树合并

    从树上启发式合并搜出来的题 然而看着好像线段树合并就能解决??? 那么就用线段树合并解决吧 维护\(max, sum\)表示值域区间中的一个数出现次数的最大值以及所有众数的和即可 复杂度\(O(n \ ...

  6. Codeforces 600 E. Lomsat gelral (dfs启发式合并map)

    题目链接:http://codeforces.com/contest/600/problem/E 给你一棵树,告诉你每个节点的颜色,问你以每个节点为根的子树中出现颜色次数最多的颜色编号和是多少. 最容 ...

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

    600E - Lomsat gelral 题意 给出一颗以 1 为根的树,每个点有颜色,如果某个子树上某个颜色出现的次数最多,则认为它在这课子树有支配地位,一颗子树上,可能有多个有支配的地位的颜色,对 ...

  8. 【学习笔记/题解】树上启发式合并/CF600E Lomsat gelral

    题目戳我 \(\text{Solution:}\) 树上启发式合并,是对普通暴力的一种优化. 考虑本题,最暴力的做法显然是暴力统计每一次的子树,为了避免其他子树影响,每次统计完子树都需要清空其信息. ...

  9. 【CF600E】Lomset gelral 题解(树上启发式合并)

    题目链接 题目大意:给出一颗含有$n$个结点的树,每个节点有一个颜色.求树中每个子树最多的颜色的编号和. ------------------------- 树上启发式合并(dsu on tree). ...

随机推荐

  1. MyEclipse项目向IDEA项目迁移

    1.首先选择File->New->Project from Existing sources/Project form Version Control,如果项目在你的本地则选择 Proje ...

  2. MongoDB的使用学习之(三)安装MongoDB以及一些基础操作

    原文链接:http://www.cnblogs.com/huangxincheng/archive/2012/02/18/2356595.html 此博主的 8天学通MongoDB 系列还是不错的,本 ...

  3. MVC项目集成swagger

    1.创建WebAPI项目解决方案 2.使用nuget引入Swashbuckle包 引入Swashbuckle包后App_Start文件夹下会多出一个SwaggerConfig文件 3.添加接口注释 项 ...

  4. nodejs npm资料

    安装淘宝的 cnpm : npm install --global cnpm 不想安装 cnpm  又想使用淘宝的服务器来下载 : npm install jquery --registry=http ...

  5. 一、Vs2019扩展多了 导航到反编译的源码中运行

    一.导航到反编译的源码中运行

  6. selenium鼠标悬停失效,用js语句模拟

    写脚本时,有很多case需要要用的鼠标悬停出菜单 用到了ActionChains(self.driver).move_to_element(el).perform(),但是脚本写完以后,单个case执 ...

  7. 2018-10-25-weekly

    Algorithm 94. 二叉树的中序遍历 What 给定一个二叉树,返回它的中序遍历. How 二叉树的中序遍历顺序为左-根-右,可以用递归来解,对左子结点调用递归函数,根节点访问值,右子节点再调 ...

  8. 【串线篇】spring boot日志框架

    一.日志框架 小张:开发一个大型系统: 1.System.out.println(""):将关键数据打印在控制台:去掉?写在一个文件? 2.框架来记录系统的一些运行时信息:日志框架 ...

  9. css 响应式(媒介查询)

    1.CSS 来实现响应式 CSS实现响应式网站的布局要用到的就是CSS中的媒体查询接下来来简单介绍一下: @media 类型 and (条件1) and (条件二){css样式} <link r ...

  10. k8s手动安装-1

    1.组网master可以使用双网卡,一个外网网卡连接外网,并且做proxy server,一个host-only网卡和node连接. 新版vitualbox配置host-only需要在主机网络管理器中 ...