2021.8.21 北中暑训
2021/8/21 23:36:33
本文主要是介绍2021.8.21 北中暑训,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
上午,学习了倍增求LCA
例题
看了题目我先是把树剖lca代码打了(因为树剖的代码比较好理解)
代码如下:
#include<bits/stdc++.h> using namespace std; int cnt,n,m,s,dd[1000001],zs[1000001],f[1000001],sd[1000001],ss[1000001],maxn,next[1000001],head[1000001],to[1000001]; inline void add(register int u,register int v) { next[++cnt]=head[u]; head[u]=cnt; to[cnt]=v; } int js(int x,int y,int z) { f[x]=y; sd[x]=z; ss[x]=1; maxn=-1; for(int i=head[x];i!=0;i=next[i]) { if(to[i]!=y) { ss[x]+=js(to[i],x,z+1); if(ss[to[i]]>maxn) { maxn=ss[to[i]]; zs[x]=to[i]; } } } return ss[x]; } void lb(int x,int y) { dd[x]=y; if(zs[x]==0) { return; } lb(zs[x],y); for(int i=head[x];i!=0;i=next[i]) { if(dd[to[i]]==0) { lb(to[i],to[i]); } } } int qz(int x,int y) { while(dd[x]!=dd[y]) { if(sd[dd[x]]<sd[dd[y]]) { swap(x,y); } x=f[dd[x]]; } if(sd[x]<sd[y]) { return x; } else { return y; } } int main() { int x,y; scanf("%d%d%d",&n,&m,&s); for(int i=1;i<n;i++) { scanf("%d%d",&x,&y); add(x,y); add(y,x); } js(s,0,1); lb(s,s); for(int i=1;i<=m;i++) { scanf("%d%d",&x,&y); printf("%d\n",qz(x,y)); } return 0; }
然后再学习倍增的lca,专研了一会,就向zx同学强请制教(物理)了
zx奆佬讲的思路很容易理解,但代码要下点功夫(主要是我脑子不好,不像隔壁zx同学秒切).
倍增的代码如下:
#include<bits/stdc++.h> using namespace std; int cnt,n,m,s,sd[1000001],f[1000001][31],next[1000001],head[1000001],to[1000001]; inline void add(register int u,register int v) { next[++cnt]=head[u]; head[u]=cnt; to[cnt]=v; } void js(int x,int y) { sd[x]=sd[y]+1; for(int i=1;(1<<i)<=sd[x];++i) { f[x][i]=f[f[x][i-1]][i-1]; } for(int i=head[x];i!=0;i=next[i]) { if(to[i]!=y) { f[to[i]][0]=x; js(to[i],x); } } return; } int lca(int x,int y) { if(sd[x]<sd[y]) { swap(x,y); } for(int i=20;i>=0;i--) { if(sd[f[x][i]]>=sd[y]) { x=f[x][i]; } if(x==y) { return x; } } for(int i=20;i>=0;i--) { if(f[x][i]!=f[y][i]) { x=f[x][i]; y=f[y][i]; } } return f[x][0]; } int main() { int x,y; scanf("%d%d%d",&n,&m,&s); for(int i=1;i<n;i++) { scanf("%d%d",&x,&y); add(x,y); add(y,x); } js(s,0); for(int i=1;i<=m;i++) { scanf("%d%d",&x,&y); printf("%d\n",lca(x,y)); } return 0; }
下午,写了一些初赛的题与LCA的题
总的来说还不错.
今天又TM是开森的一天呢!
这篇关于2021.8.21 北中暑训的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南