板子 lca

一款值得关注的开源企业管理ERP系统 盒木ERP是一款开源的现代化企业管理系统,采用前后端分离架构,后端基于Python+Django,前端使用Vue+Ant Design。系统涵盖采购、销售、库存、财务等核心业务模块,支持移动端操作和PDA扫码。具有开源免费、技术先进、功能完善等特点,适合中小企业使用或二次开发。项目提供详细部署指南,支持Docker容器化部署,是学习ERP系统开发和企业数字化转型的优秀选择。 阅读详情

模板题

tarjan做法:

离线

总时间复杂度是O(nlogn+q)

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=500010;
struct ty{
	ll t,next;
}edge[N<<1];
ll cnt1=0;
ll head[N];
ll n,m,s;
ll a,b;
template<typename Type>inline void read(Type &xx)
{
    Type f=1;char ch;xx=0;
    for(ch=getchar();ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
    for(;ch>='0'&&ch<='9';ch=getchar())xx=xx*10+ch-'0';
    xx*=f;
}
struct ty2//询问结构体 
{
	ll t,next;
	ll same;//会有一组与其相同的询问,
	//每次遍历到一组时要同时把另一组去掉
	ll num;//询问的编号,最后要按顺序输出
	bool flag=0;//标记该询问是否已经被回答过	 
}q[N<<1];
void addedge(ll a,ll b)
{
	edge[++cnt1].t=b;
	edge[cnt1].next=head[a];
	head[a]=cnt1;
}
ll cnt2=0;
ll head2[N];
ll fa[N];//并查集
void addque(ll a,ll b,ll c/*记录序号*/)
{
	q[++cnt2].t=b;
	q[cnt2].next=head2[a];
	head2[a]=cnt2;
	q[cnt2].same=cnt2+1;
	q[cnt2].num=c;
	q[++cnt2].t=a;
	q[cnt2].next=head2[b];
	head2[b]=cnt2;
	q[cnt2].num=c;
	q[cnt2].same=cnt2-1;
}
ll find(ll x)
{
	return fa[x]==x?x:fa[x]=find(fa[x]);
} 
void comb(ll x,ll y)
{
	fa[find(x)]=find(y);//此处只要找到其父亲,不需要找到其祖先 
 } 
ll vis[N];//标记该节点是否被访问过 
ll ans[N];//记录答案 
void lca(ll p,ll fa)
{
	vis[p]=1;
	for(int i=head[p];i!=-1;i=edge[i].next)
	{
		ll y=edge[i].t;
		if(y==fa) continue;
		if(vis[y]) continue;
		lca(y,p);
		comb(y,p);
	}
	for(int i=head2[p];i!=-1;i=q[i].next)
	{
		ll y=q[i].t;
		if(!vis[y]) continue;//这必须是一个被访问过的节点,不然没有信息可以做 
	    if(q[i].flag) continue;//代表这个询问已经做过了 
	    ans[q[i].num]=find(y);//记录答案 
	    q[i].flag=1;
	    q[q[i].same].flag=1;
	}
}

int main()
{//ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	read(n);read(m);read(s);
	memset(head,-1,sizeof head);
	memset(head2,-1,sizeof head2);
	for(int i=1;i<=n;++i) fa[i]=i;
	for(int i=1;i<=n-1;++i)
	{
		read(a);read(b);
		addedge(a,b);
		addedge(b,a);
	} //建树;
	for(int i=1;i<=m;++i)//离线建询问 
	{
		read(a);read(b);
		addque(a,b,i);
	}
	lca(s,-1);
	for(int i=1;i<=m;++i)
	{
		printf("%lld\n",ans[i]);
	}
	return 0;
}

倍增:

将所查的两个点先放到同一深度,再一起向上走直到相见

但是维护每一个节点上面的每一级的祖先是做不到的,空间扛不住,所以采用倍增思路。

时间复杂度为O(nlogn)

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=500010;
struct ty{
	ll t,next;
}edge[N<<1];
ll cnt1=0;
ll head[N];
ll n,m,s;
ll a,b;
template<typename Type>inline void read(Type &xx)
{
    Type f=1;char ch;xx=0;
    for(ch=getchar();ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
    for(;ch>='0'&&ch<='9';ch=getchar())xx=xx*10+ch-'0';
    xx*=f;
}
void add(ll a,ll b)
{
	edge[++cnt1].t=b;
	edge[cnt1].next=head[a];
	head[a]=cnt1;
}
ll lg[N];
ll fa[N][22];
ll depth[N];
void dfs(ll u,ll p)
{
	fa[u][0]=p;
	depth[u]=depth[p]+1;
	for(int i=1;i<+lg[depth[u]];++i)
	{
		fa[u][i]=fa[fa[u][i-1]][i-1];
	}
	for(int i=head[u];i!=-1;i=edge[i].next)
	{
		ll y=edge[i].t;
		if(y==p) continue;
		dfs(y,u);
	} 
}
ll lca(ll x,ll y)
{
	if(depth[x]<depth[y]) swap(x,y);
	while(depth[x]>depth[y])
	{
		x=fa[x][lg[depth[x]-depth[y]]-1];
	}
	if(x==y) return x;
	for(int i=lg[depth[x]]-1;i>=0;--i)
	{
		if(fa[x][i]!=fa[y][i])
		{
			x=fa[x][i];
			y=fa[y][i];
		}
	}
	return fa[x][0];
}
int main()
{//ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	read(n);read(m);read(s);
	memset(head,-1,sizeof head);
	for(int i=1;i<=n-1;++i)
	{
		read(a);read(b);
		add(a,b);
		add(b,a);
	} //建树;
	for(int i=1;i<=n;++i)
	{
		lg[i]=lg[i-1]+((1<<lg[i-1])==i);
	}
	dfs(s,0);
	for(int i=1;i<=m;++i)
	{
		read(a);read(b);
		printf("%lld\n",lca(a,b));
	}
	return 0;
}

RMQ:

ST表+dfs序,将树掰成线性表来处理

还是要注意ST表的边界处理

时间复杂度O(n*log2(n)),查询O(1)

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=1e6+10;
ll first[N];//每一个字符第一次出现的时候
template<typename Type>inline void read(Type &xx)
{
    Type f=1;char ch;xx=0;
    for(ch=getchar();ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
    for(;ch>='0'&&ch<='9';ch=getchar())xx=xx*10+ch-'0';
    xx*=f;
}
struct ty{
	ll t,next; 
}edge[N];
ll cnt=0;
ll head[N];
void add(ll a,ll b)
{
	edge[++cnt].t=b;
	edge[cnt].next=head[a];
	head[a]=cnt;
}
ll ver[N];//dfs第几个访问的节点 
ll r[N]; //节点的深度
ll tot=0;//访问的序号 
void dfs(ll u,ll dep)
{
    first[u]=++tot;ver[tot]=u;r[tot]=dep;
    for(int i=head[u];i!=-1;i=edge[i].next)
    {
    	ll y=edge[i].t;
    	if(first[y]) continue;/////////搜过就跳过 
    	dfs(y,dep+1);
    	ver[++tot]=u;r[tot]=dep;
	}
} 
ll n,m,s,a,b;
ll lg[N];
void init()
{
	lg[1]=0;
	lg[2]=1;
	for(int i=3;i<=N;++i) lg[i]=lg[i/2]+1;
}
ll f[20][N],rec[20][N];
//rec记录的是区间内深度最小值的编号
int main()
{
	memset(head,-1,sizeof head);
	init();
	read(n);read(m);read(s);
	for(int i=1;i<=n-1;++i)
	{
		cin>>a>>b;
		add(a,b);
		add(b,a);
	}
	dfs(s,1);//第二个参数是深度,不是爸爸,所以写1而不是-1 
	for(int i=1;i<=tot;++i)
	{
	    f[0][i]=r[i];
		rec[0][i]=ver[i];//分别记录数字内容和对应的深度	
	} 
	for(int i=1;i<=lg[tot];++i)
	{
		for(int j=1;j+(1<<i)-1<=tot;++j)
		{
			if(f[i-1][j]<f[i-1][j+(1<<(i-1))])
			{
				f[i][j]=f[i-1][j];
				rec[i][j]=rec[i-1][j];
			}
			else
			{
				f[i][j]=f[i-1][j+(1<<(i-1))];
				rec[i][j]=rec[i-1][j+(1<<(i-1))];
			}
		}
	}
	ll l,r;
	for(int i=1;i<=m;++i)
	{
		read(l);read(r);
		l=first[l];r=first[r];
		if(l>r) swap(l,r);
		ll k=lg[r-l+1];
//		ll k=0;
//		while((1<<k)<=r-l+1) k++;
//		k--;
		if(f[k][l]<f[k][r-(1<<k)+1]) cout<<rec[k][l]<<endl;
		else cout<<rec[k][r-(1<<k)+1]<<endl;
	}
	return 0;
}

光伏硅片瑕疵检测边缘计算方案:Java+YOLOv11n+GraalVM Native Image+树莓派5部署,工业级高可靠落地 本文提出了一种基于边缘计算的光伏硅片瑕疵检测方案,针对传统人工检测和云端AI方案的不足,采用Java+YOLOv11n+树莓派5的技术路线,实现了低延迟、高可靠的工业级检测。方案核心特点包括: 分层解耦的边缘架构,将感知、推理全链路下沉到树莓派5,端到端延迟<100ms; 创新性技术选型组合:Java 17+ONNX Runtime+GraalVM Native Image,内存占用<200MB; 安防级可靠性设计,支持断网缓存、看门狗守护、异常自动恢复等工业场景需求; 完全基于开源技术栈,硬件 阅读详情

相关推荐

从2-RSS-1U并联踝关节到双足机器人动态行走:雅可比矩阵与力矩控制实践

本文深入探讨了2-RSS-1U并联踝关节在双足机器人动态行走中的关键作用,详细解析了其设计原理、雅可比矩阵的应用及力矩控制实践。通过优化几何参数和控制算法,实现了低转动惯量、高刚度和紧凑设计,显著提升了机器人的行走稳定性和能量效率。文章还分享了从仿真到实物的跨越经验及未来优化方向。

weixin_42641998的博客 594

LCA 板子(最近公共祖先)

3、遍历子节点时,如果depth大于更新,说明没有被搜索过,更新depth,放入队列,更新fa数组,fa[v][0]就是它的2^0也就是父节点,然后循环k[1,15]更新fa。4、否则,x和y一起往上跳,k[15,0],结果是要一起跳到lca的下一层;如果x和y的2^k辈祖先不相同,则跳;2、x往上跳,k[15,0],二进制拼凑,如果x跳了当前的k还是大于等于y的深度,就跳,否则不跳且continue。3、现在x和y同一深度了,如果x=y,说明y是x和y的lca,returnx。1、假设x是更深的那个。..

m0_51448653的博客 470

OctoMag: An Electromagnetic System for 5-DOF Wireless Micromanipulation

电磁线圈组驱动经典系统,可以作为参考。 OctoMag: 用于5自由度无线微操作的一个电磁铁系统 OctoMag: An Electromagnetic System for 5-DOF Wireless Micromanipulation [1] Paper Link Authors: J. J. Abbott, etc. 2010, TRO IEEE Transactions on Robot...

XU Yangxin的博客 1665

LCA板子

【代码】LCA板子。

weixin_75192140的博客 144

RK3588上跑通Zipformer语音识别的3个坑与填坑实录(附完整编译命令)

本文详细记录了在RK3588开发板上部署Zipformer语音识别模型时遇到的三个典型问题及其解决方案,包括静态库版本冲突、编译脚本配置错误以及模型转换精度调优。文章提供了完整的编译命令和实战步骤,帮助开发者快速在边缘设备上实现高效的语音识别应用。

l6m7n8的博客 714

北斗B1频点信号捕获实战:如何应对NH码跳变带来的挑战?

本文深入探讨了北斗B1频点信号捕获中NH码跳变带来的核心挑战。针对NH码以1kHz速率调制导致的相干积分中断和相关峰畸变问题,文章提出并详细解析了一种基于伪码与多普勒频率分离技术的优化捕获方案。该方案通过差分处理消除NH跳变影响,并利用匹配滤波器与FFT分别进行码相位和多普勒频率的快速估计,有效提升了弱信号环境下的捕获灵敏度和稳定性,为北斗接收机设计提供了实用的工程参考。

joy55的博客 534

Tarjan----寻找最近公共祖先(LCA) 板子

Tarjan算法的时间复杂度为O(N+Qα(N)),其中N是节点数,Q是查询数,α是Ackermann函数的反函数,通常可以认为是一个很小的常数。该算法通过深度优先搜索(DFS)遍历图,并使用并查集(Union-Find)数据结构来快速找到两个节点的最近公共祖先。否则,将其中一个节点的根节点的父节点设置为另一个节点的根节点,然后重复此过程直到找到它们的最近公共祖先。3. 对每一对查询的节点(u, v),分别找到它们的根节点(即最终的祖先)。1. 对图进行深度优先搜索(DFS),记录每个节点的深度和父节点。

2301_77961281的博客 1496

使用3sigma原则去除数据表中的极端值

本文使用3sigma解决数据表中出现的极端值问题,其中包括基本原理、使用原则(检验方法)、代码展示这3个部分

qq_51397866的博客 4377

lca板子

#include<bits/stdc++.h> using namespace std; const int N=5e5+10; int head[N]; int n,m,s,f[N][30],lg[N],h[N]; ///该结点的深度 ///f[i][j]为i结点向上2^j的祖先 struct node { int to,ne; }bian[N*2]; int tot = 0; void add_edge(int x,int y) { tot++; bian[tot].to

qq_51379351的博客 432

基于大模型的围术期谵妄防控系统研究报告

围术期谵妄是一种急性脑功能障碍综合征,通常发生在手术前后一段时间内。患者会出现意识障碍、注意力不集中、认知功能紊乱、睡眠 - 觉醒周期失调等症状,严重者甚至会出现幻觉、妄想和攻击行为 。这种病症不仅会给患者自身带来极大的痛苦,还会对其术后康复产生严重的负面影响。从患者角度来看,围术期谵妄会显著延长患者的住院时间,增加患者的医疗费用负担。有研究表明,发生谵妄的患者住院时间平均比未发生者延长 2 - 3 天。长时间的住院不仅会影响患者的生活质量,还可能导致患者错过最佳的康复时机,影响身体机能的恢复。同时,谵妄还

嵌入式毕设/课设资料清单(速查手册·文档模板·题库,持续更新)→ 见最新文章 1071

YOLOv8改进,YOLOv8添加可变性卷积DCNv2

DCNv2对原始的DCNv1进行了改进,可变形卷积网络的卓越性能源于其适应对象几何变化的能力。通过对其自适应行为的检查,虽然对其神经特征的空间支持比常规的ConvNets更接近于对象结构,但这种支持可能远远超出感兴趣区域,导致特征受到不相关图像内容的影响。为了解决这个问题,我们提出了一种可变形卷积网的重新表述,通过提高建模能力和更强的训练,提高了其专注于相关图像区域的能力。通过更全面地集成网络中的可变形卷积,并引入扩展变形建模范围的调制机制,增强了建模能力。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 3606

LCA 板子题

来自某校内赛(2333 题目大意:     给你一棵树,并有m次询问。每次给出A,B,C三个数,然后要求一个点x使得A\B\C三点路径最短。 思路:   这一看就是极好的题,ZZ知道直接倍增求LCA好了。其中三个LCA中,不相等的一个必然为正解。(然后我就一直挂在倍增求LCA了2333 代码:(来自std) #include #include #include #include #in

B_LL2016的博客 714

Android 14.0 开机广播接收慢广播延迟问题分析

在14.0的系统rom定制化开发中,在某些时候在接收开机广播的时候发现,过了一分钟才收到开机广播,接下来就需要分析下 开机广播的相关分发机制,来处理下相关问题

安卓兼职framework和app工程师的博客 629

LCA倍增板子

最近公共祖先简称 LCA(Lowest Common Ancestor)

JK01WYX的博客 616

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

LCA 板子

LCA

qq_53504307的博客 288

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

LCA板子题

P3379 【模板】最近公共祖先(LCA) #include<bits/stdc++.h> using namespace std; const int maxn=5e5+10; int f[maxn][20],d[maxn],dist[maxn]; int head[maxn],ver[2*maxn],nxt[2*maxn],edge[2*maxn]; ...

weixin_30915951的博客 184

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

板子|LCA倍增解法

目录 LCA 定义 重要结论 倍增 解法 板子题目 板子 LCA 定义 LCA(Lowest Common Ancestors),即最近公共祖先,是指在有根树中,找出某两个...

aozhu1375的博客 281

树链剖分求LCA板子

#include<iostream> #include<vector> #include<queue> #include<cstring> #include<cmath> #include<map> #include<set> #include<cstdio> #include<algorithm> #define debug(a) cout<<#a<<"="<&l...

代码笔记本 156

【板子】LCA Tarjan

这是一份基于 Tarjan(塔扬)算法的最近公共祖先(LCA)模板及详细讲解。该算法利用和的思想,是目前求解 LCA 问题最高效的算法之一(时间复杂度 O(N+Q),其中 N 为节点数,Q 为询问数)。

ysa051030的博客 246

(详细)LCA板子以及入门题总结

LCA算法总结 把lca题目记入下来!分享给你们 板子tarjan(离线) #define N 10005 #define M 1000005 // N 表示的树的节点 // M 表示的问题数 int cnt_e,cnt_q,head_e[N],head_q[N],vis[N],dis[N],t,ans[M],id[N],f[N]; // 边,问题数 struct node{ int ...

李dayday 780

【板子】LCA 树链剖分

树链剖分的核心思想是将一棵树切分成若干条链,使得在查找路径时效率最高。重儿子 (Heavy Son):对于节点 u,它的所有子节点中,子树节点数量最多的那个儿子。轻儿子 (Light Son):除了重儿子以外的所有儿子。重边 (Heavy Edge):连接节点 u 和它的重儿子的边。轻边 (Light Edge):连接节点 u 和它的轻儿子的边。重链 (Heavy Chain):由多条重边连接而成的路径。性质:任意一条树上的路径,最多只会被切成 logn 条链。这就是为什么它速度快的原因。

ysa051030的博客 214

[算法学习]——通过RMQ与dfs序实现O(1)求LCA(含封装板子)

每周五篇博客:(3/5)

Resot的博客 1459
上一篇: 树的直径(板子)
下一篇: Codeforces E. Game With String
sophilex
博客等级 码龄5年 840粉丝 155原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值