[CF600E]Dsu on tree
题意:树上每个点都有颜色,称一个颜色占领一棵子树,当且仅当没有别的颜色在这棵子树内的数量比它多。求所有子树的占领颜色之和。题解:最显然的是DFS序+主席树或莫队,这里使用Dsu on tree。
每次暴力DFS之后,只撤销除重儿子之外的点的贡献。由于重儿子的性质,均摊后复杂度为$O(n\log n)$。
1 #include<cstdio> 2 #include<algorithm> 3 #include<iostream> 4 #define rep(i,l,r) for (int i=(l); i<=(r); i++) 5 #define For(i,x) for (int i=h[x],k; i; i=nxt[i]) 6 typedef long long ll; 7 using namespace std; 8 9 const int N=1000010; 10 int n,u,v,cnt,tot[N],mx,col[N],sz[N],son[N],h[N],to[N],nxt[N]; 11 ll ans[N],sm; 12 bool skip[N]; 13 14 void add(int u,int v){ to[++cnt]=v; nxt[cnt]=h[u]; h[u]=cnt; } 15 16 void get(int x,int fa){ 17 sz[x]=1; 18 For(i,x) if ((k=to[i])!=fa){ 19 get(k,x); sz[x]+=sz[k]; 20 if (sz[k]>sz[son[x]]) son[x]=k; 21 } 22 } 23 24 void dfs(int x,int fa,int op){ 25 tot[col[x]]+=op; 26 if (op>0 && tot[col[x]]>=mx){ 27 if (tot[col[x]]>mx) sm=0,mx=tot[col[x]]; 28 sm+=col[x]; 29 } 30 For(i,x) if ((k=to[i])!=fa && !skip[k]) dfs(k,x,op); 31 } 32 33 void work(int x,int fa,bool cl){ 34 For(i,x) if ((k=to[i])!=fa && k!=son[x]) work(k,x,1); 35 if (son[x]) work(son[x],x,0),skip[son[x]]=1; 36 dfs(x,fa,1); ans[x]=sm; skip[son[x]]=0; 37 if (cl) dfs(x,fa,-1),mx=sm=0; 38 } 39 40 int main(){ 41 scanf("%d",&n); 42 rep(i,1,n) scanf("%d",&col[i]); 43 rep(i,2,n) scanf("%d%d",&u,&v),add(u,v),add(v,u); 44 get(1,0); work(1,0,0); 45 rep(i,1,n) cout<<ans[i]<<' '; 46 return 0; 47 }
转载于:https://www.cnblogs.com/HocRiser/p/9444511.html
[CF600E]Dsu on tree相关推荐
- dsu on tree 模板题目(CF600E Lomsat gelral)
题解: dsu on tree 对于结点i来说,步骤为: 递归轻儿子,不保留贡献. 递归重儿子,保留贡献. 统计当前结点及所有轻儿子的贡献. 拿个样例来解释算法的流程 比如说样例2: 如图所示,有多个 ...
- 【CF 600E】Lomsat gelral(树上启发式合并, dsu on tree, 静态链分治,模板题)
Algorithm 名称:树上启发式合并, dsu on tree, 静态链分治 用处:一般用来解决一类不带修改的子树查询问题 核心思想为:利用重链剖分的性质优化子树贡献的计算. 前置知识:启发式合并 ...
- dsu on tree入门
先瞎扯几句 说起来我跟这个算法好像还有很深的渊源呢qwq.当时在学业水平考试的考场上,题目都做完了不会做,于是开始xjb出题.突然我想到这么一个题 看起来好像很可做的样子,然而直到考试完我都只想出来一 ...
- 2020 China Collegiate Programming Contest Changchun F - Strange Memory(dsu on tree + 位运算小技巧)
题目连接: https://codeforces.com/gym/102832/problem/F 首先写这个题的时候要注意内存的问题 不要瞎几把define int long long 题解: 考虑 ...
- 阔力梯的树(2020 CCPC Wannafly Winter Camp Day2 Div.12 )dsu on tree
题解: dsu on tree dsu on tree的基本步骤就不说了 看到这题询问结点的子树问题,而且询问时离线的,首先想到的dsu on tree的这个trick. 本题的难题就是如何维护结点所 ...
- CF375D Tree and Queries(dsu on tree)
题解: 个人感觉这个题目是一个挺不错的题的.(这里就不说dsu on tree的这个过程是什么了) 我们在dsu on tree计算答案时需要有一个小小技巧去优化一下时间复杂度. 就是当我们用一个cn ...
- CF570D Tree Requests(dsu on tree)
题解: dsu on tree 首先dsu on tree是一个离线的算法,所以我们需要先把他们的询问储存起来,然后进行操作. 针对于每一个结点,我们先统计出他和他子树的所有信息,然后对于这个结点来说 ...
- 【UOJ#388】【UNR#3】配对树(线段树,dsu on tree)
[UOJ#388][UNR#3]配对树(线段树,dsu on tree) 题面 UOJ 题解 考虑一个固定区间怎么计算答案,把这些点搞下来建树,然后\(dp\),不难发现一个点如果子树内能够匹配的话就 ...
- [Codeforces741D]Arpa's letter-marked tree and Mehrdad's Dokhtar-kosh paths——dsu on tree
题目链接: Codeforces741D 题目大意:给出一棵树,根为$1$,每条边有一个$a-v$的小写字母,求每个点子树中的一条最长的简单路径使得这条路径上的边上的字母重排后是一个回文串. 显然如果 ...
- B. Alyona and a tree(dsu on tree + bit)
B. Alyona and a tree(dsu on tree + bit) 给定一颗以111号节点为根的树,每个点有点权aia_iai,边有边权,如果vvv控制了点uuu,当且仅当uuu是vvv ...
最新文章
- mark一下总是记混的重定向与转发的区别
- 画Series的散点图
- Go进阶(8): map嵌套的两轮初始化
- subquery unnesting、Subquery unnesting and View Merge
- LOJ#2087 国王饮水记
- 越用越快的福禄克布线认证测试仪
- 前端学习(285):移动端简单知识
- 网络编程中使用float型数据要注意
- OpenShift 4 - 用KubeletConfig和ContainerRuntimeConfig分别修改集群节点的Kubelet和cri-o的配置
- Android:BaseAdapter简单应用
- 对CMMI标准的简单理解
- scrapy xpath空列表_我的第一个爬虫——Scrapy爬虫详细操作入门指南(1)
- Subsonic使用
- Flutter 旋转动画
- 史上最详细金卡介绍以及金卡制作教程(附风暴数码CID转换码链接)
- 【NOIP2006】金明的预算方案
- Masking Adversarial Damage: Finding Adversarial Saliency for Robust and Sparse Network
- 红蓝攻防演练过程中零失陷经验分享
- 微信公众号文章/菜单添加小程序时路径如何获取?
- JADE学习笔记2 :Agent的创建和运行
热门文章
- html中展开的小箭头,HTML5 移动网页应用中的展开式标签(带上下指示箭头)
- 二叉树 --5.1.3 Binary Tree Zigzag Level Order Traversal --图解
- CAS单点登陆,URL多出个参数jsessionid导致登陆失败问题
- 双线服务器有什么作用,双线服务器什么意思
- Collectors.summingDouble()
- php设置路径别名,设置别名php = / bin / php56,但今天它已恢复为原始路径:/ bin / php...
- mysql int类型 int(11) 和int(2)区别
- MyEclipse控制台报错:java.lang.OutOfMemoryError: PermGen space
- 【转】J2ME开发环境的建立
- 面向对象编程风格 VS 基于对象编程风格