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

唯一注意的是线段树的更新,因为同一子树中可能有多种颜色占主导地位,要输出编号和,比如一颗子树中,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 */

最新文章

  1. pcl曲面网格模型的三种显示方式
  2. iframe 跨域相互操作
  3. 创建WP8试用应用
  4. 自定义ViewGroup须知
  5. class.c 添加中文注释(2)
  6. 兼容IE678的placeholder
  7. iOS不得姐项目--精华模块上拉下拉的注意事项,日期显示,重构子控制器,计算cell的高度(只计算一次),图片帖子的显示
  8. 【uoj149】 NOIP2015—子串
  9. 使用selenium来完成的例子
  10. RequireJS进阶(一) 转
  11. iOS的APP验证版本更新方法
  12. JavaScript 应用开发 #1:理解模型与集合
  13. 八、桥接模式--结构模式(Structural Pattern)
  14. WPF笔记(1.10 绘图)——Hello,WPF!
  15. Android短信监听(二)——利用ContentObserver实现短信监听
  16. 关于ubuntu的图标创建以及快捷方式打开
  17. 移动平台Unity3D 应用性能优化
  18. 【总结】关于YUV-RGB格式转换的一些个人理解
  19. react native 键盘弹起时必须点击两次才能成功
  20. Jfrog Maven jenkins pipeline 流水线 培训 简单实验

热门文章

  1. HashSet集合存储数据的结构(哈希表)和Set集合存储㢝不重复的原理
  2. centos7设置虚拟机静态ip
  3. Spring源码 03 IOC原理
  4. HCIA-datacom 4.3 实验三:网络地址转换配置实验
  5. java数组---稀疏数组与数组之间的相互转化
  6. Redis图形化管理工具
  7. GB/T 28181联网系统通信协议结构和技术实现
  8. KingbaseES 支持pivot and unpivot 功能
  9. 从零开始搭建gitea代码管理平台
  10. 天天写SQL,这些神奇的特性你知道吗?