求助
查看原帖
求助
492662
Endt楼主2022/3/8 20:26
66pts  TLE66pts\ \ TLE
#include<bits/stdc++.h>
using namespace std;

void dfs(int x); 
int lca(int x,int y);
void solve(int x,int y);
int get_maxF(int x);

struct NODE{
	int fir,d,dp,f[30];
}p[50005];
struct EDGE{
	int v,nxt;
	
	void add(int U,int V,int id){
		v=V;
		nxt=p[U].fir;
		p[U].fir=id;
	}
}e[100005];

int n,k;
int main(){
	scanf("%d%d",&n,&k);
	for(int i=1;i<=2*n-2;i+=2){
		int u,v;
		scanf("%d%d",&u,&v);
		e[i].add(u,v,i);
		e[i+1].add(v,u,i+1);
	}
	p[1].dp=1;
	dfs(1);
	for(int i=1;i<=k;++i){
		int x,y;
		scanf("%d%d",&x,&y);
		solve(x,y);
	}
	printf("%d",get_maxF(1));
	return 0;
}

void dfs(int x){
	for(int i=p[x].fir;i;i=e[i].nxt){
		int v=e[i].v;
		if(v==p[x].f[0])continue;
		p[v].f[0]=x;
		p[v].dp=p[x].dp+1;
		dfs(v);
	}
	for(int i=1;i<=20;++i){
		p[x].f[i]=p[p[x].f[i-1]].f[i-1];
	}
}

int lca(int x,int y){
	int dp_x=p[x].dp,dp_y=p[y].dp,j=0;
	if(dp_x==dp_y){
		if(x==y)return x;
		for(;p[x].f[j]!=p[y].f[j];++j);
		if(j==0)return p[x].f[0];
		else return lca(p[x].f[j-1],p[y].f[j-1]);
	}else{
		if(dp_x>dp_y){
			for(;p[p[x].f[j]].dp>=p[y].dp;++j);
			return lca(p[x].f[j-1],y);
		}else{
			for(;p[p[y].f[j]].dp>=p[x].dp;++j);
			return lca(x,p[y].f[j-1]);
		}
	}
}

void solve(int x,int y){
	int f=lca(x,y);
	++p[x].d,++p[y].d;
	--p[f].d,--p[p[f].f[0]].d;
}

int get_maxF(int x){
	int ans=0;
	for(int i=p[x].fir;i;i=e[i].nxt){
		int v=e[i].v;
		if(v==p[x].f[0])continue;
		ans=max(get_maxF(v),ans);
		p[x].d+=p[v].d;
	}
	return max(ans,p[x].d);
}
6pts  WA6pts\ \ WA
#include<bits/stdc++.h>
using namespace std;

void dfs(int x); 
int lca(int x,int y);
void solve(int x,int y);
int get_maxF(int x);

struct NODE{
	int fir,d,dp,f[30];
}p[50005];
struct EDGE{
	int v,nxt;
	
	void add(int U,int V,int id){
		v=V;
		nxt=p[U].fir;
		p[U].fir=id;
	}
}e[100005];

int n,k;
int main(){
	scanf("%d%d",&n,&k);
	for(int i=1;i<=2*n-2;i+=2){
		int u,v;
		scanf("%d%d",&u,&v);
		e[i].add(u,v,i);
		e[i+1].add(v,u,i+1);
	}
	p[1].dp=1;
	dfs(1);
	for(int i=1;i<=k;++i){
		int x,y;
		scanf("%d%d",&x,&y);
		solve(x,y);
	}
	printf("%d",get_maxF(1));
	return 0;
}

void dfs(int x){
	for(int i=p[x].fir;i;i=e[i].nxt){
		int v=e[i].v;
		if(v==p[x].f[0])continue;
		p[v].f[0]=x;
		p[v].dp=p[x].dp+1;
		dfs(v);
	}
	for(int i=1;i<=20;++i){
		p[x].f[i]=p[p[x].f[i-1]].f[i-1];
	}
}

int lca(int x,int y){
	if(x==y)return x;
	if(p[x].dp<p[y].dp)swap(x,y);
	for(int i=20;i>=0;--i){
		if(p[p[x].f[i]].dp>=p[y].dp)x=p[x].f[i];
	}
	for(int i=20;i>=0;--i){
		if(p[x].f[i]!=p[y].f[i])x=p[x].f[i],y=p[y].f[i];
	}
	return x;
}

void solve(int x,int y){
	int f=lca(x,y);
	++p[x].d,++p[y].d;
	--p[f].d,--p[p[f].f[0]].d;
}

int get_maxF(int x){
	int ans=0;
	for(int i=p[x].fir;i;i=e[i].nxt){
		int v=e[i].v;
		if(v==p[x].f[0])continue;
		ans=max(get_maxF(v),ans);
		p[x].d+=p[v].d;
	}
	return max(ans,p[x].d);
}
2022/3/8 20:26
加载中...