CF EDU - E. Lomsat gelral 树上启发式合并
学习: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 树上启发式合并相关推荐
- CodeForces - 600E Lomsat gelral(树上启发式合并)
题目链接:点击查看 题目大意:给出一棵树,每个节点都有一个编号代表一种颜色,现在对于每个子树求出现最多的颜色的编号之和 题目分析:因为n给到了1e5,看完这个题第一反应就是暴力n*n,但显然是会超时的 ...
- Codeforces 600E Lomsat gelral 树上启发式合并,线段树合并.
文章目录 题意 题解 update:洛谷上已经可交此题. 题意 给一棵1为根的树,每个点有个颜色,求每一个点的子树里出现最多的颜色的和. 题解 我们用两组nnn个mapcnt和summap\ cnt和 ...
- 【CF 600E】Lomsat gelral(树上启发式合并, dsu on tree, 静态链分治,模板题)
Algorithm 名称:树上启发式合并, dsu on tree, 静态链分治 用处:一般用来解决一类不带修改的子树查询问题 核心思想为:利用重链剖分的性质优化子树贡献的计算. 前置知识:启发式合并 ...
- [CF600] E. Lomsat gelral ( 经典树上启发式合并 dus on tree )
题目链接:E. Lomsat gelral 题解 经典树上启发式合并的题目,按照正常暴力求时间复杂度为O(n2){O(n^2)}O(n2),很明显是有问题的.那么树上启发式合并是如何做的呢. 先说一些 ...
- 【学习笔记】树上启发式合并
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 树上启发式合并 模板 复杂度分析 例题 **Problem A. Arpa's letter-m ...
- [dsu on tree]树上启发式合并总结(算法思想及模板附例题练习)
文章目录 前言 树上启发式合并 引入 算法思想 时间复杂度 模板 练习 例题:CF600E Lomsat gelral solution code CF208E Blood Cousins solut ...
- 树上启发式合并问题 ---- 2019icpc南昌 K. Tree (树上启发式合并 + 动态开点线段树)
题目链接 题目大意: 就是给你一颗树,每个点有个权值viv_ivi,问你有多少对(x,y)(x,y)(x,y)满足: xxx不是yyy的祖先 yyy也不是xxx的祖先 xxx和yyy的距离不超过kk ...
- 树上启发式合并问题 ---- D. Tree and Queries[树上启发式合并+树状数组]
题目链接 题目大意: 就是给你一棵树,树上每个节点都有一个颜色,在你mmm次询问每次询问给你一个节点uuu和一个数字kkk,问你在uuu这颗子树里面又少种颜色的结点个数是大于kkk; 解题思路: 看到 ...
- 树上启发式合并问题 ---- D. Tree Requests [状态压缩+树上启发式合并]
题目链接 题目大意: 就是给你一颗树,树上每个点都有一个小写字母,现在给你m∈[1,5e5]m\in [1,5e5]m∈[1,5e5]次询问,每次询问给你一个u,和deep,问你在u这课子树中,距离1 ...
最新文章
- docker mysql日志写入本地_Docker Compose搭建MySQL主从复制集群
- 多个openstack合并成一个openstack的多个region
- c++ printf怎么用_【经典】把脉printf中的C进阶技巧
- 图灵2008年12月出版的计算机图书
- 联想m100显示耗材_RTX3070显卡搭档高性能显示器,畅玩精美游戏大作!
- SwipeRefreshLayout + RecyclerView 实现 上拉刷新 和 下拉刷新
- Charles抓包工具_基本功能
- 心电自动分析技术综述-Phililps DXL / GE Marquette / Glasgow / HES Hannover / Mortara / 福田 / 光电...
- 局域网部署文档协同办公系统:Windows + onlyoffice + dzzoffice
- word根据数字符号自动回车
- doc 问卷调查模板表_调查问卷模板.doc
- 几种常见的7号电池的容量
- 电阻参数_电阻的基础知识和参数介绍
- 根据银行卡号获取对应的银行信息
- DNT精英论坛(暨.NET北京俱乐部)第1期:见证.NET,风口上的成功案例!
- 网站推广优化教程100条(完整版)-
- 韩商言房子卖价有多高,做现女友就有多难?
- ruby--数值类(Numeric)
- 二、谈谈对数据库中索引的理解
- js 金额千分位转换
热门文章
- 青岛理工大学c语言软件,青岛理工大学C语言程序打印版.docx
- jquery基本过滤选择器(jquery筛选选择器)
- 土方工程量计算表格excel_土方量调配表(Excel公式版)
- 计算机组成原理—双口RAM和多模块存储器
- Codeforces Round #468 (Div. 2): C. Laboratory Work(贪心)
- 弦图与完美消除序列(bzoj 1006: [HNOI2008]神奇的国度)
- matlab字符串转换
- 吴恩达神经网络和深度学习-学习笔记-42-目标检测
- Kubernetes部分Volume类型介绍及yaml示例
- Python设置Tkinter窗口屏幕居中