步骤如下:1. 将当前查询需要的根makeroot, 表示为当前根下的lca2. 将x Access到根, 此时x到根
原创
2022-07-05 12:05:44
74阅读
LCA LCA ver1 int LCA(int u, int v) { if (D[u] < D[v])swap(u, v);//保证D[u]>D[v] //2^L 是不小与树的高度的最小的2的幂,其中L=ceil(log2(n)); for (int h = L; h >= 0; h--)//让 ...
转载
2021-10-05 23:58:00
27阅读
2评论
lca
原创
2018-11-27 20:32:49
371阅读
#include<bits/stdc++.h>using namespace std;#define maxn 555555int n,m,s,x,y,a,b,k;int deep[maxn],dis[maxn],tot;int head[maxn],dp[maxn][22];struct node{ int v,to;} edge[maxn*2];void ...
转载
2022-01-10 10:58:47
35阅读
#include #include #define Max 500010 using namespace std; void read(int &x) { x=0;int f=1; char ch=getchar(); while(ch>'9'||ch='0'&&ch<='9') { x=x*10+(int)ch-48; c...
原创
2021-07-28 10:22:29
29阅读
#include <vector>using namespace std;#define MAX_NODES 1024vector<int> tree[MAX_NODES];int ancestor[MAX_NODES];int visited[MAX_NODES];int question[MAX_NODES][MAX_NODES];void Init(int node1
原创
2010-09-13 01:26:50
447阅读
最近公共祖先。#include<iostream>using namespace std;int jump(int u,int step){ for (int k=0 k<=20 k++) if (step&(l<<k)>0) u:=f[u][k]; return u;}int lca(int u,int v){ if (deep[u])<deep[v]) swap(
原创
2021-07-12 17:22:03
93阅读
LCA:树上最近公共祖先目前掌握的算法有两种(都是在线做法) 先说简单的:倍增这里写代码片#include#include#include#include#includeusing namespace std;struct node{ int u,v,next;...
转载
2017-06-21 21:18:00
58阅读
2评论
例题:洛谷P3379一,朴素版O(nm)思路:1,将两个节点调整到同一层。2,每一次两个节点依次往上跳,如果两个点相遇的话,那么该节点即为这两个点的根节点。二,倍增O(n(log)^2)思路:1,假设函数up(x,d)返回点x向上跳d步的节点。2,将两个节点调整到同一层,假设当前的节点分别为u和v,当前深度为d1,他们的LCA的深度为d2,那么如果d(也就是跳的高度)>=d1-d2,那么u=
原创
2023-07-21 18:00:02
99阅读
3730: 震波Time Limit: 15 Sec Memory Limit: 256 MBSubmit: 1202 Solved: 288[Submi
原创
2023-07-07 13:06:38
23阅读
lca的做法还是很明显的,简单粗暴,不过不是正解,如果树是长链就会跪,直接变成O(n)、、最后跑的也挺快,出题人还是挺阳光的。。#include #include #include #include #include #include #include #include #include #include #include #include #inclu
原创
2021-08-13 14:07:10
65阅读
lca的做法还是非常明显的。简单粗暴。
只是不是正解,假设树是长链就会跪。直接变成O(n)、、
最后跑的也挺快,出题人还是挺阳光的。。
动态树的解法也是听别人说能ac的,预计就是放在splay上剖分一下,做法还是比較复杂的。,,
来一发lca:
#include <stdio.h>
#include <iostream>
#include <algorith
转载
2017-08-04 13:09:00
540阅读
#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <cmath> #include <cstring> #define inf 2147483647 #define N 100
转载
2017-08-14 22:33:00
66阅读
2评论
在做树上问题时,我们经常会遇到$LCA$(最近公共祖先)问题。曾经的我遇到这类问题只会$O(n)$暴力求解,学了倍增$LCA$,就可以$O(logn)$解决了。
转载
2018-10-29 15:46:00
101阅读
2评论
【地址】点击打开链接I LCA:什么是LCA?Lowest
转载
2022-04-20 09:49:05
109阅读
##Description LCA就是在一棵树中求x与y的最近公共祖先,复杂度 首先f[i][j]表示i节点向上跳个能跳到f[i][j],deep[i]表示i在树中的深度。 步骤:1、首先把x和y跳到同一个深度当中;2、然后使x和y调到同一个点中。 ##Code 发现了一种十分优美的LCA打法。int lca(int x,int y){ int i;if(deep[x]<deep[y]
原创
2022-12-26 18:21:58
67阅读
1151LCA in a Binary Tree(30分)The lowest common ancestor (LCA) of two nodes U
原创
2023-03-02 08:38:23
66阅读
传送门大家都写的差分,我太菜了看不懂啊与是这成了我练习暴力数据结构的好机会...我们发现,当往上走时,一个点对答案有贡献, dep[s] - dep[x] = time[x]往下走 dep[t] - dep[x] = len - time[x]于是我想,把dep在一层的放在一起,建一棵树那怎么提取区间呢其实区间就是 st[u] -- ed[u] (dfs序)然后动态开点就可以了#
原创
2022-07-05 10:22:11
52阅读
lca的做法还是非常明显的。简单粗暴, 只是不是正解。假设树是长链就会跪,直接变成O(n)、、 最后跑的也挺快,出题人还是挺阳光的。。 动态树的解法也是听别人说能ac的。预计就是放在splay上剖分一下,做法还是比較复杂的。,, 来一发lca: #include <stdio.h> #include
转载
2016-01-27 17:54:00
40阅读
2评论
待解决poj3694【树形DP+LCA】
原创
2022-12-07 00:17:03
69阅读