相当于是线段树合并的模板题,比(雨天的尾巴)还要板。

唯一注意的是线段树的更新,因为同一子树中可能有多种颜色占主导地位,要输出编号和,比如一颗子树中,1出现3次(最多),3出现3次,那么应该输出4。

 1 #include<bits/stdc++.h>
2 #define ll long long
3 using namespace std;
4 const int N = 1e5 + 10, M = 1e5;
5 struct node {
6 int lc, rc;
7 ll dat, num;//dat次数最多颜色的次数,num编号和
8 }tr[N * 50];
9 int head[N], to[N << 1], nxt[N << 1], tot;
10 int n, rt[N], cnt, co[N];
11 ll ans[N];
12 void add(int x, int y) {
13 nxt[++tot] = head[x];
14 head[x] = tot;
15 to[tot] = y;
16 }
17
18 void pushup(int k) {//注意
19 node a = tr[tr[k].lc], b = tr[tr[k].rc];
20 if (a.dat > b.dat) {
21 tr[k].dat = a.dat;
22 tr[k].num = a.num;
23 }
24 else if (a.dat < b.dat) {
25 tr[k].dat = b.dat;
26 tr[k].num = b.num;
27 }
28 else {
29 tr[k].dat = a.dat;
30 tr[k].num = a.num + b.num;
31 }
32 }
33
34 void insert(int p, int l, int r, int pos, int val) {
35 if (l == r) {
36 tr[p].dat += val;
37 tr[p].num = l;
38 return ;
39 }
40 int mid = (l + r) >> 1;
41 if (pos <= mid) {
42 if (!tr[p].lc) tr[p].lc = ++cnt;
43 insert(tr[p].lc, l, mid, pos, val);
44 }
45 else {
46 if (!tr[p].rc) tr[p].rc = ++cnt;
47 insert(tr[p].rc, mid + 1, r, pos, val);
48 }
49 pushup(p);
50 }
51
52 int merge(int p, int q, int l, int r) {
53 if (!p || !q) return p + q;
54 if (l == r) {
55 tr[p].dat += tr[q].dat;
56 tr[p].num = l;
57 return p;
58 }
59 int mid = (l + r) >> 1;
60 tr[p].lc = merge(tr[p].lc, tr[q].lc, l, mid);
61 tr[p].rc = merge(tr[p].rc, tr[q].rc, mid + 1, r);
62 pushup(p);
63 return p;
64 }
65
66 void dfs(int u, int f) {
67 for (int i = head[u]; i; i = nxt[i]) {
68 int v = to[i];
69 if (v == f) continue;
70 dfs(v, u);
71 rt[u] = merge(rt[u], rt[v], 1, M);
72 }
73 ans[u] = tr[rt[u]].num;
74 }
75
76 int main() {
77 scanf("%d", &n);
78 for (int i = 1; i <= n; i++) {
79 scanf("%d", &co[i]);
80 rt[i] = ++cnt;
81 insert(rt[i], 1, M, co[i], 1);
82 }
83 for (int i = 1; i < n; i++) {
84 int a, b;
85 scanf("%d%d", &a, &b);
86 add(a, b),add(b, a);
87 }
88 dfs(1, 0);
89 for (int i = 1; i <= n; i++) printf("%lld ", ans[i]);
90 return 0;
91 }
92 /*
93 4
94 1 2 3 4
95 1 2
96 2 3
97 2 4
98 */

CF600E Lomsat gelral (线段树合并)的更多相关文章

  1. CF600E:Lomsat gelral(线段树合并)

    Description 一棵树有n个结点,每个结点都是一种颜色,每个颜色有一个编号,求树中每个子树的最多的颜色编号的和. Input 第一行一个$n$.第二行$n$个数字是$c[i]$.后面$n-1$ ...

  2. CF600E Lomsat gelral——线段树合并/dsu on tree

    题目描述 一棵树有$n$个结点,每个结点都是一种颜色,每个颜色有一个编号,求树中每个子树的最多的颜色编号的和. 这个题意是真的窒息...具体意思是说,每个节点有一个颜色,你要找的是每个子树中颜色的众数 ...

  3. codeforces 600E . Lomsat gelral (线段树合并)

    You are given a rooted tree with root in vertex 1. Each vertex is coloured in some colour. Let's cal ...

  4. CodeForces600E Lomsat gelral 线段树合并

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

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

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

  6. CF600E Lomsat gelral 【线段树合并】

    题目链接 CF600E 题解 容易想到就是线段树合并,维护每个权值区间出现的最大值以及最大值位置之和即可 对于每个节点合并一下两个子节点的信息 要注意叶子节点信息的合并和非叶节点信息的合并是不一样的 ...

  7. codeforces 600E E. Lomsat gelral (线段树合并)

    codeforces 600E E. Lomsat gelral 传送门:https://codeforces.com/contest/600/problem/E 题意: 给你一颗n个节点的树,树上的 ...

  8. BZOJ.3307.雨天的尾巴(dsu on tree/线段树合并)

    BZOJ 洛谷 \(dsu\ on\ tree\).(线段树合并的做法也挺显然不写了) 如果没写过\(dsu\)可以看这里. 对修改操作做一下差分放到对应点上,就成了求每个点子树内出现次数最多的颜色, ...

  9. [XJOI NOI2015模拟题13] C 白黑树 【线段树合并】

    题目链接:XJOI - NOI2015-13 - C 题目分析 使用神奇的线段树合并在 O(nlogn) 的时间复杂度内解决这道题目. 对树上的每个点都建立一棵线段树,key是时间(即第几次操作),动 ...

随机推荐

  1. mysql查询版本

    系统环境下 :mysql -V; mysql内:select version();

  2. 后端Python3+Flask结合Socket.io配合前端Vue2.0实现简单全双工在线客服系统

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_158 在之前的一篇文章中:为美多商城(Django2.0.4)添加基于websocket的实时通信,主动推送,聊天室及客服系统,详 ...

  3. Postgres常用时间查询

    如select extract(day from now());

  4. 手搓一个“七夕限定”,用3D Engine 5分钟实现烟花绽放效果

    七夕来咯!又到了给重要的人送惊喜的时刻. 今年,除了将心意融入花和礼物,作为程序员,用自己的代码本事手搓一个技术感十足"七夕限定"惊喜,我觉得,这是不亚于车马慢时代手写信的古典主义 ...

  5. 【Java面试】什么是IO的多路复用机制?

    "什么是IO的多路复用机制?" 这是一道年薪50W的面试题,很遗憾,99%的人都回答不出来. 大家好,我是Mic,一个工作了14年的Java程序员. 今天,给大家分享一道网络IO的 ...

  6. Taurus.MVC WebAPI 入门开发教程5:控制器安全校验属性【HttpGet、HttpPost】【Ack】【Token】【MicroService】。

    系列目录 1.Taurus.MVC WebAPI  入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...

  7. Web 前端实战:Gitee 贡献图

    前言 这次要做的 Web 前端实战是一个 Gitee 个人主页下的贡献图(在线 Demo),偶尔做一两个,熟悉熟悉 JS 以及 jQ.整体来说这个案例并不难,主要是控制第一个节点以及最后一个节点处于星 ...

  8. hotspot算法实现 <<深入理解Java虚拟机>>

    1.枚举根节点 解决何时枚举,不需要实时的枚举,oopMap数据结构对象存储枚举信息 对象引用发生变化,需要存储每一条指令到OOPMap吗,,几百M的对象耗时需要很大的内存.GC空间成本 2.安全点: ...

  9. Github文件在线加速下载

    众所周知,GitHub是一个巨大的开源宝库,以及程序员和编程爱好者的聚集地,诸多优秀的开源项目全部都是位于GitHub上.但是每当我们看到优秀的开源项目,准备去下(bai)载(piao)时,会发现速度 ...

  10. C#基础_VS常用快捷键

    Shift+End,Shift+Home,跳转到当前代码的行尾和行首. 1.窗口快捷键 记忆诀窍: 凡跟窗口挂上钩的快捷键必有一个W(Windows): Ctrl+W,W:  浏览器窗口 (浏览橱窗用 ...