社区讨论
怀疑题目数据过水(有可能是我自己的问题)
P3379【模板】最近公共祖先(LCA)参与者 4已保存回复 10
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 10 条
- 当前快照
- 1 份
- 快照标识符
- @loc4wmlz
- 此快照首次捕获于
- 2023/10/30 08:00 2 年前
- 此快照最后确认于
- 2023/11/04 14:10 2 年前
满分代码:
CPP#include<bits/stdc++.h>
using namespace std;
int n,m,s,num;
int dp[500002],h[500002],power[500002],fa[500002][22];
struct tree{
int to,next;
}e[1000000];
void cb(int from,int to){
num++;
e[num].to=to;
e[num].next=h[from];
h[from]=num;
}
void an(int u,int f){
dp[u]=dp[f]+1;
fa[u][0]=f;
for(int i=1;i<=power[dp[u]];i++)
fa[u][i]=fa[fa[u][i-1]][i-1];
for(int i=h[u];i;i=e[i].next)
if(e[i].to!=f)
an(e[i].to,u);
}
int LCA(int x,int y){
if(dp[x]<dp[y]){
int u=x;
x=y;
y=u;
}
while(dp[x]>dp[y])
x=fa[x][power[(dp[x]-dp[y])]-1];
if(x==y)
return y;
for(int i=power[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(){
scanf("%d%d%d",&n,&m,&s);
for(int i=1;i<=n-1;i++){
int x,y;
scanf("%d%d",&x,&y);
cb(x,y);
cb(y,x);
}
for(int i=1;i<=n;i++)
power[i]=power[i-1]+(1<<power[i-1]==i);
an(s,0);
for(int i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
cout<<LCA(x,y)<<endl;
}
return 0;
}
在代码33行处,即LCA函数for循环处
CPPi=power[x]-1
是错误的,正确的如下
CPPi=power[dp[x]]-1
这个错误在这道题里面没有影响,但是在P3398中就必须用第二种,也许是我的问题,还请多多指教
回复
共 10 条回复,欢迎继续交流。
正在加载回复...