树上启发式合并

news/2025/3/15 23:07:24/文章来源:https://www.cnblogs.com/smdj/p/18774371

近乎板子的题(但蒻蒟还是花了一整天)

有些问题求解时,处理完一个子树时,需要删除这颗子树的信息(答案可以顺便统计)再去统计其他子树,不然另一棵子树的信息会集成到新的子树中,导致统计出错

这时候为了减少时间复杂度,就要使用 DSU on tree ,即标题

主要做法是:
指定一颗子树最后 dfs , dfs 完其他子树并删除信息后 , 再来 dfs 这颗子树 ,因为这是最后一棵子树了,所以不用删除信息来为不存在的下一颗子树做准备 , 这样时间复杂度就降下来了 (为什么会降我也不知道啊 awa )

所以我们用轻重子树来区别 , 将重子树作为最后一个遍历的 , 这么做不是因为必须要用重子树 , 而是因为选它好区分(不选这个也不知道能用什么了,不知道,我是蒻蒟)

看看这题的代码
```cpp
#include <bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=2e5+5;
int n,m,cnt,head[N],hson[N],HSON,size[N],clr[N],tclr[N],clcnt[N],ans;struct Edge{int nxt,to;
}edge[N<<1];void add(int f,int t)
{edge[++cnt].nxt=head[f];edge[cnt].to=t;head[f]=cnt;
}void dfsn(int now)
{size[now]=1;for(int i=head[now];i;i=edge[i].nxt){int to=edge[i].to;dfsn(to);size[now]+=size[to];//找到重子树if(size[to]>size[hson[now]]) hson[now]=to;}
}void calcu(int now,int reserve)
{//根据情况,确定不同 reserve 状态的计算答案的方式tclr[clcnt[clr[now]]]--;clcnt[clr[now]]+=reserve;tclr[clcnt[clr[now]]]++;for(int i=head[now];i;i=edge[i].nxt){int to=edge[i].to;//这里只用跳过当前节点的重子树,因为其他节点是轻子树,里面的数据没有被保留,需要重新计算,而重子树的数据被保留了,再次计算会导致错误if(to==HSON) continue;calcu(to,reserve);}
}void dsu(int now,int reserve)
{//先 dfs 轻子树for(int i=head[now];i;i=edge[i].nxt){int to=edge[i].to;if(to==hson[now]) continue;dsu(to,0);//轻子树不用保留数据}if(hson[now]) dsu(hson[now],1),HSON=hson[now];//dfs 重子树,并记录重子树是哪个节点//计算重子树数据calcu(now,1);HSON=0;//计算完毕后重子树节点记录清零,放置后面要删除数据的话造成数据跳过if(clcnt[clr[now]]*tclr[clcnt[clr[now]]]==size[now]) ans++;if(!reserve) calcu(now,-1);
}int main() 
{ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>n;for(int i=1;i<=n;i++){int color,from;cin>>color>>from;add(from,i);clr[i]=color;}dfsn(1);dsu(1,1);cout<<ans;return 0;
}	

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/899431.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cmake识别不到vcpkg安装的包的解决(以libssh为例)

承接上篇 vcpkg 跨平台的c/c++库包管理工具(以libssh为例) - 夕西行 - 博客园 vcpkg安装libssh后,vs2022创建的cmake项目竟然不能find_package到libssh 问题出在CMakeLists.txt,注意位置1、2、3的顺序一定不能变cmake_minimum_required (VERSION 3.20)#vcpkg————位置1 …

昆工昆明理工大学冶金最新复试真题及答案

--冶金工程考研809冶金物理化学有色冶金学有色金属冶金冶金过程及设备F002钢铁冶金学冶金调剂

《Transformer自然语言处理实战 : 使用Hugging Face Transformers库构建NLP应用》PDF免费下载

《Transformer自然语言处理实战》聚焦 Hugging Face Transformers 库,系统讲解 Transformer 模型在 NLP 任务中的应用。涵盖文本分类、命名实体识别、机器翻译等核心技术,并提供实践案例,帮助读者快速掌握模型微调与部署。适合 NLP 初学者及希望深入理解 Transformer 的开发…

【论文阅读】maskformer: Per-Pixel Classification is Not All You Need for Semantic Segmentation

标题 Per-Pixel Classification is Not All You Need for Semantic Segmentation (NIPS 2021) 论文:Per-Pixel Classification is Not All You Need for Semantic Segmentation 代码:https://github.com/facebookresearch/MaskFormer 摘要 ​ 现代方法通常将语义分割视为逐…

鸿蒙特效教程04-直播点赞动画效果实现教程

鸿蒙特效教程04-直播点赞动画效果实现教程 在时下流行的直播、短视频等应用中,点赞动画是提升用户体验的重要元素。当用户点击屏幕时,屏幕上会出现飘动的点赞图标,感觉挺好玩的。本教程适合HarmonyOS初学者,通过简单到复杂的步骤,通过HarmonyOS的Canvas组件,一步步实现这…

鸿蒙特效教程02-微信语音录制动画效果实现教程

鸿蒙特效教程02-微信语音录制动画效果实现教程本教程适合HarmonyOS初学者,通过简单到复杂的步骤,一步步实现类似微信APP中的语音录制动画效果。最终效果预览 我们将实现以下功能:长按"按住说话"按钮:显示录音界面和声波动画 录音过程中显示实时时长 手指上滑:取…

SpringBoot使用Kafka生产者、消费者

SpringBoot使用Kafka生产者、消费者@目录依赖配置文件生产者消费者 依赖 <!--kafka--> <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId><version>xxx</version> </depend…

jasperreport 使用和问题记录

引言:之前一直没有记录的习惯,所以在这里记录有些是回忆,所以可能有些不连贯.而且本人的问题不一定是你的问题,仅作参考. (注:本人是使用java生成pdf文件) 1.介绍(只介绍自己用的到) 进入软件 File->new->jasper report->blank A4 我们得到了一张A4纸,如下图所示.(注:…

Java学习四大名著:《Java核心技术 卷II:高级特性(原书第12版)》 | PDF免费下载

《Java核心技术 卷II:高级特性(原书第12版)》是Java学习的经典书籍,该书深入探讨了 Java 语言的高级功能,涵盖流与文件处理、并发编程、网络、数据库、JVM 调优等关键主题。适合有一定基础的开发者,帮助他们掌握高效编程技巧,优化性能,并深入理解 Java 生态系统,是进阶…

STM32CubeIDE 下载与安装教程(以 1.18.0 版本为例)

STM32CubeIDE 下载与安装教程(以 1.18.0 版本为例) 软件介绍 STM32CubeIDE 是 STMicroelectronics 提供的官方集成开发环境(IDE),专为 STM32 微控制器系列设计。它融合了 STM32CubeMX 和 Eclipse 的强大功能,提供了一个完整的开发环境,适用于嵌入式软件开发和调试。STM3…

【作业3】结对项目:实现一个自动生成小学四则运算题目的命令行程序

⭐成员:3223004473詹艺珏 and 3223004301吴梦琪 📎Github链接:https://github.com/Jue610/Jue610/tree/main/ArithProbelm这个作业属于哪个课程 23软件工程这个作业要求在哪里 【作业3】结对项目这个作业的目标 实现一个自动生成小学四则运算题目的命令行程序,培养团…