倍增法(英语:binary lifting),顾名思义就是翻倍。它能够使线性的处理转化为对数级的处理,大大地优化时间复杂度。这个方法在很多算法中均有应用,其中最常用的是 RMQ 问题和求 LCA(最近公共祖先)。 一、什么是倍增? 倍增,字面意思就是“成倍增长”。这是指我们在进行递推时,如果状态空间很大,通常的线性递推无法...
观察到每个节点有两个属性:节点的父节点和节点包括的数组,在倍增LCA中我们把父节点的信息保存到了数组中,便于倍增查找最近公共祖先(LCA),在此题中我们还需要把节点包括的数组存到一个数组中,可以用二维vectorvector 存储,其他操作与查找LCA类似(就是在倍增查找LCA的基础上做亿些...
nowcoder172C 保护 (倍增lca+dfs序+主席树) https://www.nowcoder.com/acm/contest/172/C (sbw大佬太强啦 orz) 先把每一个路径(x,y)分成(x,lca),(y,lca)两个路径,然后就能发现,对于某两个(直上直下的)路径a,b,b的下端点在a的下端点子树中,且b的上端点深度<=a的上端点深度,那么b是覆盖a的。
我们考虑用dfs来处理,后面寻路的时候采用倍增法求LCA,看到零食最大也就很容易想到状态压缩,所以我们的目标就是到与到的零食之和,我们可以开数组来帮助我们进行最多次的跳转,然后通过公共祖先来解决这个问题。 //考场上的30分题解#include <bits/stdc++.h>#define IOS ios::sync_with_stdio(0), cin.tie(0)#...
/*倍增法,求lca,顺便求max权重*/ int maxUsingLca(int a, int b) { int ans = -1; // 1.将a深度调到更深(交换) if (depth[a] < depth[b]) { int t = a; a = b; b = t; } //2.将a调到和b同一高度 int k = depth[a] - depth[b];//高度差 ...
跑半遍LCA,到他俩深度相同的时候停止。然后判断是否在同一条链上,分别返回不同的答案就行了。注意在同一条链的时候,不能用u和v的,需要用u(深度大的)的和对应链上dep[v]+1的那个点的。(来看几发错误代码) 错误代码1: #include<cstdio> #include<iostream> ...
数据结构-倍增求LCA 2024-05-13 数据结构-线段树 2024-05-13 数据结构-RMQ问题 2024-05-13 数据结构-树状数组 2024-05-13 图论-欧拉回路 2024-05-13 图论-割点和桥 2024-05-13 图论-强连通分量 2024-05-13 图论-差分约束系统 2024-05-13
最终求得答案。I: 景区导游(最近公共祖先)基础LCA问题,通过倍增优化,注意longlong类型和细节处理。J: 砍树(LCA,树上差分)寻找所有询问点对的公共边,利用树上差分统计出现次数,涉及数组差分原理。整体而言,题目难度适中,考验了编码能力、调试技巧以及对细节的把握,没有特别偏题或难题。
比较裸的LCA(最近公共祖先),这里写的是倍增优化。 dis[i] 表示结点 i 离根节点的距离,则结点 i 和结点 j 的距离为 dis[i]+dis[j]-2dis[lca(i,j)]。 注意开longlong以及最后求答案的细节即可。 #include <iostream> #include <vector> #define int long long using namespace std; const int MAXX ...
Tag:最近公共祖先、倍增 题解: 涉及到树上距离,考虑最近公共祖先。 两点的最近距离t=dep[a]+dep[b]-2*dep[lca(a,b)].其中dep为节点深度。 1.a=b:答案是n. 2.t为奇数,答案为0.在(a,b)的最短路径上不存在这样的点,在树上移动时距离差的奇偶性不变 3.t为偶数 ...