社区讨论
TLE
P3379【模板】最近公共祖先(LCA)参与者 4已保存回复 6
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 6 条
- 当前快照
- 1 份
- 快照标识符
- @mi6tmud5
- 此快照首次捕获于
- 2025/11/20 10:37 4 个月前
- 此快照最后确认于
- 2025/11/20 10:37 4 个月前
又是TLE 只好求助各位大佬
作为一个习惯了cin/cout的弱鸡,scanf/printf实在不熟一打就RE,我还是太菜了。
代码如下:
CPP#include <iostream>
#include <cstring>
using namespace std;
int a[1200000],al[1200000],head[500010],an=0;
int father[500010][21],depth[500010];
bool visit[500010];
int logchart[500010];
int n,q,s;
void addline(int u,int v){
a[an]=v;al[an]=head[u];head[u]=an;
an++;
}
void logchart_build()
{
logchart[1]=0;
logchart[2]=1;
for(int i=3;i<=n;i++)
logchart[i]=logchart[i/2]+1;
}
inline void dfs_buildchart(int u,int dep){
visit[u]=1;
depth[u]=dep;
int i,j,k,l,v;
for(i=1;i<=logchart[dep];i++)
father[u][i]=father[father[u][i-1]][i-1];
for(l=head[u];l!=-1;l=al[l]){
v=a[l];
if(visit[v]==0){
father[v][0]=u;
dfs_buildchart(v,dep+1);
}
}
}
inline int find(int u,int gener){
int i,j,k,l,ans;
k=logchart[gener];
if(gener-k>0){
ans=find(father[u][k],gener-(1<<k));
}
else ans=u;
return ans;
}
inline int lca(int u,int v){
int i,j,k,l,ans=0;
if(depth[u]<depth[v])v=find(v,depth[v]-depth[u]);
else if(depth[u]>depth[v])u=find(u,depth[u]-depth[v]);
bool tag=0;
for(i=logchart[depth[u]];i>=0;i--){
if(father[u][i]!=father[v][i]){
tag=1;
ans=lca(father[u][i],father[v][i]);
}
}
if(tag==0&&u!=v)ans=father[u][0];
if(tag==0&&u==v)ans=u;
return ans;
}
int main(){
memset(al,-1,sizeof(al));
memset(head,-1,sizeof(head));
memset(visit,0,sizeof(visit));
int i,j,k,l;
cin>>n>>q>>s;
int u,v;
for(i=1;i<=n-1;i++){
cin>>u>>v;
addline(u,v);addline(v,u);
}
logchart_build();
dfs_buildchart(s,1);
for(i=1;i<=q;i++){
cin>>u>>v;
cout<<lca(u,v)<<endl;
}
return 0;
}
回复
共 6 条回复,欢迎继续交流。
正在加载回复...