WA求调
查看原帖
WA求调
1304502
China_U_19641016楼主2025/7/31 08:40
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int n,m,r,u,v,f[N][32],d[N],Q[N],c[N];
vector<int>a[N];
void bfs(int A){
    memset(c,-1,sizeof(c));
    int h=0,t=0;
    c[A]=0;
    Q[t++]=A;
    while(h<t){
        int u=Q[h++];
        for(int i=0;i<a[u].size();i++){
            int v=a[u][i];
            if(c[v]==-1){
            	c[v]=c[u]+1;
            	Q[t++]=v;
            }
        }
    }
}
void dfs(int u,int u_d){
	for(int i=1;i<25;i++){
		f[u][i]=f[f[u][i-1]][i-1];
	}
	d[u]=u_d;
	for(auto s:a[u]){
		if(s!=f[u][0]){
			f[s][0]=u;
			dfs(s,u_d+1);
		}
	}
}
int lca(int x,int y){
	if(d[x]>d[y]) swap(x,y);
	for(int i=25;i+1;i--){
		if((d[y]-d[x])&(1<<i)) y=f[y][i];
	}
	for(int i=25;i+1;i--){
		if(f[x][i]!=f[y][i]){
			x=f[x][i];
			y=f[y][i];
		}
	}
	if(x==y) return x;
	else return f[x][0];
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n-1;i++){
		cin>>u>>v;
		a[u].push_back(v);
		a[v].push_back(u);
	}
	dfs(1,1);
	for(int i=1;i<=m;i++){
		int x,y,z,dx,dy,dz,dm,ans,S;
		cin>>x>>y>>z; 
        dx=lca(x,y);dy=lca(y,z);dz=lca(z,x);
        dm=d[dx];ans=dx;
        if(d[dy]>dm) dm=d[dy],ans=dy;
        if(d[dz]>dm) dm=d[dz],ans=dz;
        bfs(ans);
        S=c[x]+c[y]+c[z];
        cout<<dm<<" "<<S<<endl;
	}
	return 0;
}

看了题解的思路,但阳历都没过

题目:https://www.luogu.com.cn/problem/P4281

2025/7/31 08:40
加载中...