TLE on subtask1 #2#13#14
查看原帖
TLE on subtask1 #2#13#14
1059675
fyc_LC楼主2024/10/16 23:10
#include<bits/stdc++.h>
using namespace std;
int fa[500600][31],ct[500600][31],dep[500600];
bool vis[500600];
vector<int> t[500600];
int l2[1000600];
void rc(int a){
	l2[1]=0;
	for(int i=2;i<=a;i++){
		l2[i]=l2[i/2]+1;
	}
}
void dfs(int rt,int bf){
	vis[rt]=1;
	fa[rt][0]=bf;
	dep[rt]=dep[fa[rt][0]]+1;
	for(int i=1;i<31;i++){
		fa[rt][i]=fa[fa[rt][i-1]][i-1];
	//	ct[rt][i]=ct[fa[rt][-1]][i-1]+ct[rt][i-1];
	}
	int siz=t[rt].size();
	for(int i=0;i<siz;i++){
		if(vis[t[rt][i]]==0){
			dfs(t[rt][i],rt);
		}
	}
}
int main(){
	int n,m,s;
	cin>>n>>m>>s;
	rc(s);
	int u,v;
	for(int i=1;i<n;i++){
		scanf("%d%d",&u,&v);
		t[u].push_back(v);
		t[v].push_back(u);
	}
	dep[s]=1;
	dfs(s,0);
	int l,r,l1,r1;
	int c1;
	for(int i=1;i<=m;i++){
		scanf("%d%d",&l,&r);
		c1=abs(dep[l]-dep[r]);
		if(dep[l]>dep[r]){//l>r;
			swap(l,r);
		}
		while(c1!=0){
			r=fa[r][l2[c1]];
			c1=c1-( 1 << (l2[c1]));
		}
		while(l!=r){
			l=fa[l][0];
			r=fa[r][0];
		}
		cout<<r<<endl; 
	}
	return 0;
}

都是2秒多,还能怎么优化

2024/10/16 23:10
加载中...