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

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

首先最裸的的暴力就是在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;
}

  

[Coderforces600E] Lomsat gelral的更多相关文章

  1. Educational Codeforces Round 2 E. Lomsat gelral 启发式合并map

    E. Lomsat gelral Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/600/prob ...

  2. Codeforces 600 E - Lomsat gelral

    E - Lomsat gelral 思路1: 树上启发式合并 代码: #include<bits/stdc++.h> using namespace std; #define fi fir ...

  3. 【CF600E】 Lomsat gelral

    CF600E Lomsat gelral Solution 考虑一下子树的问题,我们可以把一棵树的dfn序搞出来,那么子树就是序列上的一段连续的区间. 然后就可以莫队飞速求解了. 但是这题还有\(\T ...

  4. 【CodeForces】600 E. Lomsat gelral (dsu on tree)

    [题目]E. Lomsat gelral [题意]给定n个点的树,1为根,每个点有一种颜色ci,一种颜色占领一棵子树当且仅当子树内没有颜色的出现次数超过它,求n个答案——每棵子树的占领颜色的编号和Σc ...

  5. 【CF600E】Lomsat gelral(dsu on tree)

    [CF600E]Lomsat gelral(dsu on tree) 题面 洛谷 CF题面自己去找找吧. 题解 \(dsu\ on\ tree\)板子题 其实就是做子树询问的一个较快的方法. 对于子树 ...

  6. CF 600 E. Lomsat gelral

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

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

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

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

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

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

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

随机推荐

  1. 20155301 Exp7 网络欺诈防范

    20155301 Exp7 网络欺诈防范 1.基础问题回答 (1)通常在什么场景下容易受到DNS spoof攻击 (2)在日常生活工作中如何防范以上两攻击方法 2.实践过程记录 简单应用SET工具建立 ...

  2. 20155301 Exp4 恶意代码分析

    20155301 Exp4 恶意代码分析 实践目标 (1) 是监控你自己系统的运行状态,看有没有可疑的程序在运行. (2) 是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分析工具尽量使用 ...

  3. Android开发——RecyclerView特性以及基本使用方法(二)

    0.  前言 随着Android的发展,虽然ListView依旧重要,但RecyclerView确实越来越多的被大家使用.但显然并不能说RecyclerView就一定优于ListView,而是应该根据 ...

  4. python 回溯法 子集树模板 系列 —— 13、最佳作业调度问题

    问题 给定 n 个作业,每一个作业都有两项子任务需要分别在两台机器上完成.每一个作业必须先由机器1 处理,然后由机器2处理. 试设计一个算法找出完成这n个任务的最佳调度,使其机器2完成各作业时间之和达 ...

  5. vijos 1641 Vs Snowy

    代码: #include<set> #include<cstdio> #include<cstring> #include<iostream> #inc ...

  6. CSS快速入门-前端布局1(抽屉)

    一.效果图 前面对CSS基础知识有了一定的了解,是时候开始实战了!以下我对抽屉(https://dig.chouti.com/)主页进行模拟布局. 官方网站效果图: 模拟网站图: 二.实现步骤 1.整 ...

  7. ANSYS渡槽槽身动水压力的施加(1)——矩形渡槽

    前言 依据水工抗震规范中关于渡槽动水压力的部分编一个用于ANSYS渡槽模型动水压力施加的命令流,是我研究生时一直想要做的一件事,原因嘛主要是想对比一下规范提供的方法和ANSYS声学流体单元模拟水体这两 ...

  8. dokuwiki工具栏添加换行回车快捷键与按钮

    需求 dokuwiki的语法要求以 \\ 为换行符(\\后面必须有1个空格).编辑器有快捷键.快捷键说明如下.https://www.dokuwiki.org/start?id=zh-tw:acces ...

  9. ABP中文文档及源码说明

    目录 ABP.ModuleZero(ABP自带的一套用户模块) 版本管理(Edition) 特性管理(Feature)

  10. Linux_01

    要安装centos系统,就必须得有centos系统软件安装程序,可以通过浏览器访问centos官网http://www.centos.org,然后找到Downloads  - >  mirror ...