摘要:
在一棵树中,每个节点都有0个或者多个孩子节点,除了根节点以外每个节点都有一个双亲节点,从根节点到当前节点的路径上的节点都是当前节点的祖先节点, 现任意给定两个节点,要求它们的公共祖先,并且这个公共祖先离它们最近这里有两种算法:在线法和离线法.在线法:指每提出一次请求,便给出一次应答离线法:收集所有的请求,然后统一进行处理在线法 dfs+RMQ在线法主要借助了RMQ的思想,先对树进行深度优先遍历,对于含有n个节点的树,深度优先遍历产生的序列长度为2n-1, 遍历的过程中,记录每个节点第一次出现的位置,并记录序列中每个节点的层次。当询问节点a和节点b之间的最近公共祖先时,首先找到节点a和节点b第一 阅读全文
摘要:
求区间最值问题最简单的方法是遍历区间,时间复杂度O(n), 但是当查询次数很多的时候,时间效率并不高。可以用线段树把算法优化到O(logn) (在线段树中保存线段的最值),不过sparse_table算法是较好的,用O(nlogn)的时间进行预处理,然后用O(1)时间进行查询。预处理:预处理使用DP的思想,f(i, j)表示[i, i+2^j - 1]区间中的最小值,我们可以开辟一个数组专门来保存f(i, j)的值。例如,f(0, 0)表示[0,0]之间的最小值,就是num[0], f(0, 2)表示[0, 3]之间的最小值, f(2, 4)表示[2, 17]之间的最小值注意, 因为f(i, 阅读全文