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

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

首先最裸的的暴力就是在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. 20155211 Exp4 恶意代码分析

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

  2. FAT32文件系统学习(2) —— FAT表

    1.题外话 在继续本文学习FAT32文件系统之前,先来插入一点别的话题.我们都知道U盘有一个属性是容量,就拿笔者的U盘为例,笔者手上的U盘是金士顿的DataTraveler G3 4GB的一个U盘.电 ...

  3. app.use( )做一个静态资源服务

    var express = require("express"); var app = express(); //静态服务 app.use("/jingtai" ...

  4. JDBC详解系列(一)之流程

    ---[来自我的CSDN博客](http://blog.csdn.net/weixin_37139197/article/details/78838091)--- JDBC概述   使用JDBC也挺长 ...

  5. 百炼1001: Exponentiation 解题

    链接:http://bailian.openjudge.cn/practice/1001/ 思路 乍一看是很简单的题目,但是答案必须高精度输出,因此需要手动实现一个高精度运算方法.如果直接使用int, ...

  6. linux一切皆文件之tty字符设备(深入理解sshd创建pty的过程) (五)

    一.知识准备 1.在linux中,一切皆为文件,所有不同种类的类型都被抽象成文件(比如:块设备,socket套接字,pipe队列) 2.操作这些不同的类型就像操作文件一样,比如增删改查等 3.块设备支 ...

  7. DRF02

    1. 视图 Django REST framwork 提供的视图的主要作用: 控制序列化器的执行(检验.保存.转换数据) 控制数据库查询的执行 1.1. 请求与响应 1.1.1 Request RES ...

  8. BugPhobia准备篇章:团队Beta阶段准备工作分析

    0x00:序言 To the searching tags, you may well fall in love withhttp://xueba.nlsde.buaa.edu.cn/ 再见,无忧时光 ...

  9. 20135202闫佳歆--week2 一个简单的时间片轮转多道程序内核代码及分析

    一个简单的时间片轮转多道程序内核代码及分析 所用代码为课程配套git库中下载得到的. 一.进程的启动 /*出自mymain.c*/ /* start process 0 by task[0] */ p ...

  10. 每日scrum(4)

    今天是冲刺第4天,大家都忙着找大二的学弟学妹来点评来支持我们的软件. 遇到的问题主要是如何劝说学弟学妹选择我们的软件然后继续往下做. 任务看板: 燃尽图: