热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

[BZOJ1602&BZOJ1787&BZOJ2144]树上LCA的算法巩固练习

简述求LCA的倍增算法对于树上的所有节点,我们可以很轻松地通过dfs求出其直接的父亲节点以及其深度通过类似RMQ的原理我们可以处理出每个节点的第2^i个父亲这个过程既可以在

简述求LCA的倍增算法

  对于树上的所有节点,我们可以很轻松地通过dfs求出其直接的父亲节点以及其深度

  通过类似RMQ的原理我们可以处理出每个节点的第2^i个父亲

  //这个过程既可以在dfs之后双重循环建也可以像树剖模板里那样dfs里直接建

  //个人比较推荐后者,会少掉一些不必要的运算,但由于log算法的优越性使得它们实际差别不大

 

  如图u,v为题目中给的两个节点,我们要做的第一步是将u,v调整到同一深度

  做法很简单,只需要用2^i从大到小逼近答案

  调整到同一深度以后两个节点共同前进,做法和上面调整深度时一样

  细节:

    当u,v的深度刚开始就相同时一定要特判,因为运算到ln(0)会出错

 

 


 

BZOJ1602 简单的LCA模板题

BZOJ1787 题目大意是让我们求出树上三个点到同一点的边权加和最小,输出那个点和最小边权


  我们通过上面的例子可以发现,并不是三点的LCA就是边权和最小的

  因为图上的红边如果走到红色节点的时候会走两次,而走到绿色节点时只走一次,其他路径上的节点各一次

  发现其实和树的重心有点关系...然后就想到了暴力滚粗的ZJOI Day1T1

  其实这道题没那么麻烦...因为只有三个点,很容易想到最终的答案一定是其中两个点的LCA

  那么枚举三次就可以了,先将其中两个点做一次LCA,求出路径边权和,再将这个新求出的点和剩下的点做LCA,求路径和

  第一问的答案就是第一次LCA后求出的那个点

BZOJ2144

  几乎看不出来和LCA有什么关系的题...

  但是想出来了之后觉得这个思路简直太好了...

  对于一个状态我们用三元组表示(x,y,z)

  一种转移是从外面的点跳向中间,而显然由于题目中“只能跳过一颗棋子”的限制所以只有一种方法

  而从中间的点跳向两边就有两种方式

  按照以前的思路,这里就直接BFS敲起来了..

  我们考虑每一个三元组不停地向中间跳一定有一个最终状态

  而这个最终状态向外跳又能产生一系列形如二叉树的状态

  我们将向外跳定义为向儿子状态的连边,向上条定义为向父亲节点的连边

  两个状态的树上路径长度正好的题目中要求的内容

  而第一问只需判断根节点的状态是否一样就可以了

 

  但对于10^9的数据,想到这里显然还不够

  我们面临着两个问题,一个是depth怎么求(数组根本开不下状态也枚举不完),第二个是第2^i个父亲怎么求

  我们发现这两个问题是有联系的

  考虑一个状态(x,y,z),设t1=y-x,t2=z-y

  当t1>t2时,显然是右边的z往左跳,但是可以跳几步呢?我们解不等式即可得出:(t1-1)div t2步

  当t2>t1时同理

  每次更新t1,t2我们发现它实际上是一个辗转相除的过程,也就是没有几步就可以到达根节点

  也可以根据这个过程叠加出深度

  也可以根据这个过程,算出已知状态的第2^i个父亲状态

 

  这样一来,这个问题就差不多解决了

  最后一个细节,读进来的状态是无序的,要排序后再做/w\

 


推荐阅读
  • 三角测量计算三维坐标的代码_双目三维重建——层次化重建思考
    双目三维重建——层次化重建思考FesianXu2020.7.22atANTFINANCIALintern前言本文是笔者阅读[1]第10章内容的笔记,本文从宏观的角度阐 ... [详细]
  • 专业人士如何做自媒体 ... [详细]
  • 非计算机专业的朋友如何拿下多个Offer
    大家好,我是归辰。秋招结束后,我已顺利入职,并应公子龙的邀请,分享一些秋招面试的心得体会,希望能帮助到学弟学妹们,让他们在未来的面试中更加顺利。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 拼多多的崛起之路
    随着4G通信技术的发展,互联网产品从PC端转向移动端,图像传输速度更快、更清晰,智能设备的应用提升了用户体验。移动互联网的普及为拼多多的崛起提供了时代背景。 ... [详细]
  • 结城浩(1963年7月出生),日本资深程序员和技术作家,居住在东京武藏野市。他开发了著名的YukiWiki软件,并在杂志上发表了大量程序入门文章和技术翻译作品。结城浩著有30多本关于编程和数学的书籍,其中许多被翻译成英文和韩文。 ... [详细]
  • 对于众多创业公司而言,选择小程序或小视频的发展方向至关重要。本文将深入分析小程序和小视频的特点、优势及局限,帮助创业者做出更明智的选择。 ... [详细]
  • 在2019中国国际智能产业博览会上,百度董事长兼CEO李彦宏强调,人工智能应务实推进其在各行业的应用。随后,在“ABC SUMMIT 2019百度云智峰会”上,百度展示了通过“云+AI”推动AI工业化和产业智能化的最新成果。 ... [详细]
  • 在机器学习领域,深入探讨了概率论与数理统计的基础知识,特别是这些理论在数据挖掘中的应用。文章重点分析了偏差(Bias)与方差(Variance)之间的平衡问题,强调了方差反映了不同训练模型之间的差异,例如在K折交叉验证中,不同模型之间的性能差异显著。此外,还讨论了如何通过优化模型选择和参数调整来有效控制这一平衡,以提高模型的泛化能力。 ... [详细]
  • 本文通过对快速排序和堆排序的算法效率进行详细对比分析,探讨了快速排序在实际应用中为何能表现出更高的性能。快速排序通过分治策略实现高效排序,其平均时间复杂度为O(n log n),而堆排序虽然最坏情况下的时间复杂度也是O(n log n),但在实际运行中由于频繁的数据交换和维护堆结构的操作,导致其性能不如快速排序。此外,快速排序在缓存友好性和并行处理方面也具有明显优势,使其在现代计算机架构中表现更为出色。 ... [详细]
  • 题目解析给定 n 个人和 n 种书籍,每个人都有一个包含自己喜好的书籍列表。目标是计算出满足以下条件的分配方案数量:1. 每个人都必须获得他们喜欢的书籍;2. 每本书只能分配给一个人。通过使用深度优先搜索算法,可以系统地探索所有可能的分配组合,确保每个分配方案都符合上述条件。该方法能够有效地处理这类组合优化问题,找到所有可行的解。 ... [详细]
  • 独家解析:深度学习泛化理论的破解之道与应用前景
    本文深入探讨了深度学习泛化理论的关键问题,通过分析现有研究和实践经验,揭示了泛化性能背后的核心机制。文章详细解析了泛化能力的影响因素,并提出了改进模型泛化性能的有效策略。此外,还展望了这些理论在实际应用中的广阔前景,为未来的研究和开发提供了宝贵的参考。 ... [详细]
  • 浅析卷积码的应用及其优势:探讨卷积编码在通信系统中的关键作用与特性
    本文详细介绍了卷积编码的基本原理,并深入分析了其在通信系统中的应用及其显著优势。卷积编码通过在编码过程中引入冗余信息,有效提高了数据传输的可靠性和抗干扰能力,成为现代通信系统中不可或缺的关键技术。文章还探讨了卷积编码在不同场景下的具体实现方法及其性能特点。 ... [详细]
  • 在2019年寒假强化训练中,我们深入探讨了二分算法的理论与实践应用。问题A聚焦于使用递归方法实现二分查找。具体而言,给定一个已按升序排列且无重复元素的数组,用户需从键盘输入一个数值X,通过二分查找法判断该数值是否存在于数组中。输入的第一行为一个正整数,表示数组的长度。这一训练不仅强化了对递归算法的理解,还提升了实际编程能力。 ... [详细]
  • 深入解析 OpenSSL 生成 SM2 证书:非对称加密技术与数字证书、数字签名的关联分析
    本文深入探讨了 OpenSSL 在生成 SM2 证书过程中的技术细节,重点分析了非对称加密技术在数字证书和数字签名中的应用。非对称加密通过使用公钥和私钥对数据进行加解密,确保了信息传输的安全性。公钥可以公开分发,用于加密数据或验证签名,而私钥则需严格保密,用于解密数据或生成签名。文章详细介绍了 OpenSSL 如何利用这些原理生成 SM2 证书,并讨论了其在实际应用中的安全性和有效性。 ... [详细]
author-avatar
背着单反看世界
这个家伙很懒,什么也没留下!
Tags | 热门标签
RankList | 热门文章
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有