首页 > 其他分享 >LA 问题的若干种解法

LA 问题的若干种解法

时间:2024-08-03 10:27:41浏览次数:14  
标签:log Algorithm LA 复杂度 若干种 单次 我们 解法 mathrm

看了眼 P5903 的题解区,方法还是挺多的,那我就浅浅的总结一下。


Algorithm 1

最简单的,直接往他的父亲节点跳,单次询问复杂度 \(\mathrm O(n)\),总复杂度为 \(\mathrm O(qn)\)。这是最基础的写法。

Algorithm 2

我们用倍增的思想来做,这个也很简单不多讲,单次的复杂度为 \(\mathrm O(\log n)\),总复杂度为 \(\mathrm O(q \log n)\)。

Algorithm 3

我们可以考虑使用重链剖分。如果这个链的顶端没有跳过的话,就直接跳到链顶的父亲,否则直接推就可以了,因为 \(dfs\) 序是连续的。单次复杂度也是 \(\mathrm O(\log n)\),总复杂度为 \(\mathrm O(q \log n)\)。

看似复杂度是一样的,但是速度比 Algorithm 2 要快许多,此时已经可以通过了。

Algorithm 4

我们考虑如何优化 Algorithm 3。

我们发现我们需要跳到 \(k\) 级祖先的重链,然后我们就可以 \(\mathrm O(1)\) 知道祖先的位置了。然而跳链过程是 \(\mathrm O(\log n)\),瓶颈就这这里。我们考虑如何更快地找到这条链。

我们发现一个点上面至多有 \(\log n\) 条链,那么我们直接二分这个点锁在的重链的位置即可。单次的复杂度为 \(\mathrm O(\log \log n)\)。由于瓶颈在前面了,所以总复杂度不变。

Algorithm 5

我们依然考虑如何优化 Algorithm 3。

我们可以一次跳 \(\sqrt \log n\) 个祖先,这样子我们就可以一次多跳几个祖先了。单次复杂度为 \(\mathrm O(\sqrt \log n)\),总复杂度为 \(\mathrm O(q \sqrt \log n)\)。

Algorithm 6

这题的正解:长链剖分。

比较麻烦。先按照节点深度树剖。然后利用倍增数组跳到 \(2^x\),剩余的距离差为 \(k_1\),这里 \(2^x > k_1\)。然后由于长链的长度 \(> k_1\),那么因此可以先将 \(x\) 跳到 \(x\) 所在链的顶点。

若之后剩下的级数为正,则利用向上的数组求出答案,否则利用向下的数组求出答案。单次时间复杂度 \(\mathrm O(1)\),但是瓶颈在前面,复杂度为 \(\mathrm O(n \log n)\)。

Algorithm 7

这题还有一个比较科技的做法-----用 \(\pm 1 \ \text{FS(Find Smaller)}\) 问题。

我们发现 \(x\) 的深度为 \(d\) 的祖先是他后面的第一的深度 \(\le d\) 的节点。那么这个问题就是一个 \(\text{FS}\) 问题了。然后欧拉序具有 \(\pm 1\) 的性质。那么这个问题就变成了 \(\pm 1 \ \text{FS(Find Smaller)}\) 问题,这个问题有良好的性质。可以线性处理,在线常数查询。

标签:log,Algorithm,LA,复杂度,若干种,单次,我们,解法,mathrm
From: https://www.cnblogs.com/Carousel/p/18340118

相关文章

  • 谷粒商城实战笔记-115-全文检索-ElasticSearch-进阶-bool复合查询
    文章目录1,must2,mustnot3,should1,must{"query":{"bool":{"must":[{"match":{"gender":"M"}},{"matc......
  • 谷粒商城实战笔记-118-全文检索-ElasticSearch-进阶-aggregations聚合分析
    文章目录一,基本概念主要聚合类型二,实战1,搜索address中包含mill的所有人的年龄分布以及平均年龄,但不显示这些人的详情2,按照年龄聚合,并且请求每个年龄的平均薪资Elasticsearch的聚合(Aggregations)功能允许用户对数据集进行聚合分析,从而获得数据的摘要信息。聚......
  • 找不到 Keras.utils.layer_utils
    如何解决该错误:"Nomodulecalledlayer_utils"当我尝试从Keras或Tensorflow安装或导入它时,我收到一条错误消息,指出它不存在。我正在按照一个教程安装来自需求的各种依赖项.txt文件,但可能缺少一些内容。keras.utils.layer_utils在较新版本的Keras中......
  • Lambda表达式
    Python使用 lambda 来创建匿名函数lambda函数是一种小型、匿名的、内联函数,它可以具有任意数量的参数,但只能有一个表达式。用于编写简单函数、通过赋值给变量或作为参数  带参与不带参不带参数带参数带默认参数带不定长参数 #lambda表达式func1=lambda:10......
  • 基于GA遗传优化的PID控制器最优控制参数整定matlab仿真
    1.程序功能描述        通过遗传优化算法,将PID控制器的kp,ki,kd三个参数作为遗传算法的优化变量,将PID控制器的输出误差作为遗传算法的目标值。通过迭代优化,输出控制器最优状态下对应的控制参数kp,ki,kd,即最后的参数整定结果。 2.测试软件版本以及运行结果展示MATLAB2022......
  • Jupyter Lab和Jupyter Notebook的区别
    JupyterLab与JupyterNotebook:详细比较简介JupyterNotebook是一个开源的Web应用程序,允许用户创建和共享包含实时代码、方程、可视化和解释性文本的文档。JupyterLab是JupyterNotebook的下一代界面,提供了更高级的功能和更现代化的用户界面。用户界面JupyterNotebook单文档......
  • 【大数据开发语言Scala的入门教程】
    ......
  • Context-Aware Safe Medication Recommendations with Molecular Graph and DDI Graph
    这篇文章是2023年AAAI会议上的一篇论文,主要是利用分子图和DDI图嵌入来提供上下文感知信息,从而进行安全药物推荐。链接Context-AwareSafeMedicationRecommendationswithMolecularGraphandDDIGraphEmbedding|ProceedingsoftheAAAIConferenceonArtificialInt......
  • [paper阅读笔记][2023]CorpusLM: Towards a Unified Language Model on Corpusfor Kno
    文章链接:https://arxiv.org/pdf/2402.01176v2Paper的任务处理各种知识密集型任务任务的科学问题本文任务虽然是:提出一个统一的语言模型来处理各种知识密集型任务,但其实其本质科学问题是:如何提高LLMs在知识密集型任务中的检索效率。原因是:LLMs在生成文本时容易出现错误信......
  • GEE案例:Landsat 5、7、8影像构建1985-2023年rsei生态遥感指数详细代码
    之前关于RSEI的博客 GoogleEarthEngine(GEEÿ......