板子 lca

Spring Boot 构建war 部署到tomcat下无法在Nacos中注册服务 因此,当使用外部容器时,如此处的 Tomcat 来部署项目,AbstractAutoServiceRegistration 就不能监听到容器启动事件了,也就不会尝试向服务注册中心注册当前这个微服务,那么注册就失败了,并且也就没有异常信息了。自定义获取获取外部容器端口的方法, 然后监听应用启动事件,当应用被启动时,获取外部容器启动的端口号,然后将这个 port 设置到 NacosAutoServiceReigistration 中。在启动类同级目录,复制下面代码即可(不需要修改,直接构建war即可) 阅读详情

模板题

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;
}

PSCAD通过python调用自动化库的实现 带有python脚本的pscad自动化PSCAD通过python调用自动化库的实现前期准备实现 PSCAD通过python调用自动化库的实现 在网上搜了一圈没有找到,通过油管的一个视频学到了,这里分享一下。 前期准备 下载PSCAD 在官方文档中建议PSCADV4.6.1及以上版本 下载python python这里没注明哪些版本可用,博主下载了最新的3.8.2使用正常。 下载IDE py... 阅读详情

相关推荐

交通流预测爬坑记(一):交通流数据集,原始数据

常用的交通流数据集,持续更新~~

K_first的博客 4万+

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

VisionMaster SDK C#二次开发核心技术指南

以下是基于**VisionMaster SDK C#二次开发核心技术指南**,结合实战案例与关键代码解析,帮助开发者快速掌握工业视觉应用集成。

东城十三 3052

LCA板子

【代码】LCA板子。

weixin_75192140的博客 144

3台虚拟机部署Doris详细文档(含校验步骤)

摘要:本文详细介绍了Apache Doris在3台虚拟机上的集群部署方案。采用1主FE+1从FE+1观察者FE+3BE的混合部署模式,确保元数据高可用性。硬件配置建议测试环境4核16GB内存,生产环境8核64GB内存。部署步骤包括系统环境配置(关闭防火墙、内核参数优化)、FE/BE节点配置启动、集群初始化验证等。重点配置了IP白名单(172.30.0.115)和数据目录(/data/doris)。通过MySQL客户端和WebUI可监控集群状态,实现千万级数据的实时分析能力,后续可通过增加BE节点线性扩展。

weixin_41026747的博客 932

手把手教你用RoboTwin训练RDT模型:从环境配置到实战微调(避坑指南)

本文提供了一份详尽的避坑指南,手把手教你如何在RoboTwin开源仿真环境中,从零开始配置环境、采集数据并完成RDT视觉语言动作模型的实战微调。文章涵盖了环境搭建、数据流水线构建、模型配置与训练等关键步骤,旨在帮助研究者和开发者高效利用仿真数据,低成本探索具身智能应用。

weixin_29094979的博客 131

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

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

2301_77961281的博客 1496

16、天文时间序列分类:基于人工神经网络的研究

本研究探讨了基于人工神经网络的天文时间序列分类方法,重点比较了MLP、LSTM和CNN等模型在BRITE和开普勒K2数据集上的表现。研究发现LSTM不适用于此类数据,而结合特征提取与PSO超参数优化的多层感知器(MLP)在开普勒K2数据上实现了98.55%的二分类准确率。通过精细的数据预处理和高置信度样本选择,显著提升了分类性能。研究成果为恒星变异性识别提供了高效工具,并对天文学与机器学习交叉领域具有重要参考价值。

pz8901234的博客 112

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

22h2版本的win10安装Docker Desktop时页面空白

摘要:Windows10 22H2系统重装Docker时出现安装界面卡死问题,通过管理员CMD执行静默安装命令解决。命令指定了WSL-2后端及多个自定义数据存储路径(安装目录、Hyper-V数据、Windows容器数据、WSL数据),安装需等待几分钟。最终验证安装成功。

猿小白的博客 654

RK3568适配MIPI屏幕触摸,触摸延时很大

我用的是系统,接了一个,设备树已经正确配置,evtest测试坐标值和触摸位置都是准确的。但是出现了一个:我在屏幕上点一下,要等大约 2 秒才能在evtest里看到坐标事件打印。这种现象在 Goodix 系列触摸驱动里比较少见,一般意味着。

小灰灰的博客 1363

LCA 板子题

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

B_LL2016的博客 714

Python爬虫实战:实时爬取东方财富网股票行情

东方财富网实时行情(价格、涨跌幅、成交量等)K线图、分时图、技术指标市盈率、换手率、总市值等指标相比某些收费API,东方财富网页端接口不需要登录、免费、响应快、封装清晰,适合爬虫实践。东方财富网股票数据接口分析实时数据抓取与字段提取数据结构化处理自动化批量抓取多线程加速采集数据可视化展示支持存储为CSV/Excel/数据库。

2201_76125261的博客 1万+

LCA倍增板子

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

JK01WYX的博客 616

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

LCA 板子

LCA

qq_53504307的博客 288

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

板子|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、付费专栏及课程。

余额充值