学习:http://codeforces.com/blog/entry/44351

E. Lomsat gelral

题意:

给定一个以1为根节点的树,每个节点都有一个颜色,问每个节点的子树中,颜色最多的是哪几种颜色,输出这些颜色的值得和。

思路:

树上启发式合并的模板题,具体来说,先对树进行树链剖分,分出一个重链和轻边,dfs时,把每条轻儿子暴力加到根节点中,每次加的时候,用这样的技巧

if(csz < cnt[col[v]]) sum = col[v] , csz = cnt[col[v]];
else if(csz==cnt[col[v]]) sum += col[v];

就可以使得sum中保存的是这个节点的子树中数量相同且最多的颜色和。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <list>
#include <cstdlib>
#include <iterator>
#include <cmath>
#include <iomanip>
#include <bitset>
#include <cctype>
using namespace std;
//#pragma comment(linker, "/STACK:102400000,102400000")  //c++
#define lson (l , mid , rt << 1)
#define rson (mid + 1 , r , rt << 1 | 1)
#define debug(x) cerr << #x << " = " << x << "\n";
#define pb push_back
#define pq priority_queuetypedef long long ll;
typedef unsigned long long ull;typedef pair<ll ,ll > pll;
typedef pair<int ,int > pii;//priority_queue<int> q;//这是一个大根堆q
//priority_queue<int,vector<int>,greater<int> >q;//这是一个小根堆q
#define fi first
#define se second
#define endl '\n'#define OKC ios::sync_with_stdio(false);cin.tie(0)
#define FT(A,B,C) for(int A=B;A <= C;++A)  //用来压行
#define REP(i , j , k)  for(int i = j ; i <  k ; ++i)
//priority_queue<int ,vector<int>, greater<int> >que;const ll mos = 0x7FFFFFFF;  //2147483647
const ll nmos = 0x80000000;  //-2147483648
const int inf = 0x3f3f3f3f;
const ll inff = 0x3f3f3f3f3f3f3f3f; //18

template<typename T>
inline T read(T&x){x=0;int f=0;char ch=getchar();while (ch<'0'||ch>'9') f|=(ch=='-'),ch=getchar();while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();return x=f?-x:x;
}
// #define _DEBUG;         //*//
#ifdef _DEBUG
freopen("input", "r", stdin);
// freopen("output.txt", "w", stdout);
#endif
/*-----------------show time----------------*/const int maxn = 1e5+9;vector<int>g[maxn];vector<int>v[maxn];int cnt[maxn],col[maxn];ll ans[maxn];bool big[maxn];int n;int sz[maxn];void dfs1(int v,int fa){sz[v] = 1;for(int i=0; i<g[v].size(); i++){int u = g[v][i];if(u!=fa){dfs1(u,v);sz[v]+=sz[u];}}}ll sum = 0,csz = 0;// priority_queue<int>que;void add(int v, int fa,int x){cnt[col[v]] += x;// if(v==1)cout<<"$$"<<cnt[col[v]]<<endl;if(csz < cnt[col[v]]) sum = col[v] , csz = cnt[col[v]];else if(csz==cnt[col[v]]) sum += col[v];for(int i=0;i<g[v].size(); i++){int u = g[v][i];if(u!=fa && big[u]==0){add(u,v,x);}}}void dfs(int v,int fa,int keep){int mx = -1,bigChild = -1;for(int i=0; i<g[v].size(); i++){int u = g[v][i];if(u!=fa && sz[u] > mx)mx = sz[u], bigChild = u;}for(int i=0; i<g[v].size(); i++){int u = g[v][i];if(u!=fa && u!=bigChild){dfs(u,v,0);
                        }}if(bigChild!=-1){dfs(bigChild,v,1),big[bigChild] = 1;/
                    }add(v,fa,1);            ////ans[v] = sum;/*debug(v);for(int i=1; i<=n; i++){cout<<cnt[i]<<" ";}cout<<endl;*/if(bigChild!=-1) big[bigChild] = 0;if(keep==0){add(v,fa,-1);sum = 0;csz = 0;}/*debug(v);for(int i=1; i<=n; i++){cout<<cnt[i]<<" ";}cout<<endl;*/}int main(){scanf("%d", &n);for(int i=1; i<=n; i++)scanf("%d", &col[i]);for(int i=1; i<n; i++){int u,v;scanf("%d%d", &u, &v);g[u].pb(v);g[v].pb(u);}dfs1(1,0);dfs(1,0,1);for(int i=1; i<=n; i++)printf("%lld " , ans[i]);printf("\n");return 0;
}

EDU#2E

转载于:https://www.cnblogs.com/ckxkexing/p/9425558.html

CF EDU - E. Lomsat gelral 树上启发式合并相关推荐

  1. CodeForces - 600E Lomsat gelral(树上启发式合并)

    题目链接:点击查看 题目大意:给出一棵树,每个节点都有一个编号代表一种颜色,现在对于每个子树求出现最多的颜色的编号之和 题目分析:因为n给到了1e5,看完这个题第一反应就是暴力n*n,但显然是会超时的 ...

  2. Codeforces 600E Lomsat gelral 树上启发式合并,线段树合并.

    文章目录 题意 题解 update:洛谷上已经可交此题. 题意 给一棵1为根的树,每个点有个颜色,求每一个点的子树里出现最多的颜色的和. 题解 我们用两组nnn个mapcnt和summap\ cnt和 ...

  3. 【CF 600E】Lomsat gelral(树上启发式合并, dsu on tree, 静态链分治,模板题)

    Algorithm 名称:树上启发式合并, dsu on tree, 静态链分治 用处:一般用来解决一类不带修改的子树查询问题 核心思想为:利用重链剖分的性质优化子树贡献的计算. 前置知识:启发式合并 ...

  4. [CF600] E. Lomsat gelral ( 经典树上启发式合并 dus on tree )

    题目链接:E. Lomsat gelral 题解 经典树上启发式合并的题目,按照正常暴力求时间复杂度为O(n2){O(n^2)}O(n2),很明显是有问题的.那么树上启发式合并是如何做的呢. 先说一些 ...

  5. 【学习笔记】树上启发式合并

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 树上启发式合并 模板 复杂度分析 例题 **Problem A. Arpa's letter-m ...

  6. [dsu on tree]树上启发式合并总结(算法思想及模板附例题练习)

    文章目录 前言 树上启发式合并 引入 算法思想 时间复杂度 模板 练习 例题:CF600E Lomsat gelral solution code CF208E Blood Cousins solut ...

  7. 树上启发式合并问题 ---- 2019icpc南昌 K. Tree (树上启发式合并 + 动态开点线段树)

    题目链接 题目大意: 就是给你一颗树,每个点有个权值viv_ivi​,问你有多少对(x,y)(x,y)(x,y)满足: xxx不是yyy的祖先 yyy也不是xxx的祖先 xxx和yyy的距离不超过kk ...

  8. 树上启发式合并问题 ---- D. Tree and Queries[树上启发式合并+树状数组]

    题目链接 题目大意: 就是给你一棵树,树上每个节点都有一个颜色,在你mmm次询问每次询问给你一个节点uuu和一个数字kkk,问你在uuu这颗子树里面又少种颜色的结点个数是大于kkk; 解题思路: 看到 ...

  9. 树上启发式合并问题 ---- D. Tree Requests [状态压缩+树上启发式合并]

    题目链接 题目大意: 就是给你一颗树,树上每个点都有一个小写字母,现在给你m∈[1,5e5]m\in [1,5e5]m∈[1,5e5]次询问,每次询问给你一个u,和deep,问你在u这课子树中,距离1 ...

最新文章

  1. docker mysql日志写入本地_Docker Compose搭建MySQL主从复制集群
  2. 多个openstack合并成一个openstack的多个region
  3. c++ printf怎么用_【经典】把脉printf中的C进阶技巧
  4. 图灵2008年12月出版的计算机图书
  5. 联想m100显示耗材_RTX3070显卡搭档高性能显示器,畅玩精美游戏大作!
  6. SwipeRefreshLayout + RecyclerView 实现 上拉刷新 和 下拉刷新
  7. Charles抓包工具_基本功能
  8. 心电自动分析技术综述-Phililps DXL / GE Marquette / Glasgow / HES Hannover / Mortara / 福田 / 光电...
  9. 局域网部署文档协同办公系统:Windows + onlyoffice + dzzoffice
  10. word根据数字符号自动回车
  11. doc 问卷调查模板表_调查问卷模板.doc
  12. 几种常见的7号电池的容量
  13. 电阻参数_电阻的基础知识和参数介绍
  14. 根据银行卡号获取对应的银行信息
  15. DNT精英论坛(暨.NET北京俱乐部)第1期:见证.NET,风口上的成功案例!
  16. 网站推广优化教程100条(完整版)-
  17. 韩商言房子卖价有多高,做现女友就有多难?
  18. ruby--数值类(Numeric)
  19. 二、谈谈对数据库中索引的理解
  20. js 金额千分位转换

热门文章

  1. 青岛理工大学c语言软件,青岛理工大学C语言程序打印版.docx
  2. jquery基本过滤选择器(jquery筛选选择器)
  3. 土方工程量计算表格excel_土方量调配表(Excel公式版)
  4. 计算机组成原理—双口RAM和多模块存储器
  5. Codeforces Round #468 (Div. 2): C. Laboratory Work(贪心)
  6. 弦图与完美消除序列(bzoj 1006: [HNOI2008]神奇的国度)
  7. matlab字符串转换
  8. 吴恩达神经网络和深度学习-学习笔记-42-目标检测
  9. Kubernetes部分Volume类型介绍及yaml示例
  10. Python设置Tkinter窗口屏幕居中