100+2tle求优化
查看原帖
100+2tle求优化
193412
Hsy23333楼主2023/11/7 19:07
#include<bits/stdc++.h>
using namespace std;
int n,m,s;
struct p{
	int cnt=0;
	map <int,int> l;
}qwq[500004];
int bz[500004][21];
bool vst[500004];
int fa[500004],sd[500004];
void dfs(int k,int d){
	sd[k]=d;
	vst[k]=1;//标记访问
	if(d!=1){
		int w=1,awa=fa[k];
		for(int i=0;w<=d;i++){//倍增初始化 
			w=w<<1;
			bz[k][i]=awa;//cout<<"???"<<ksm(2,i)<<endl;
			awa=bz[awa][i];
		}
	}
	for(int i=1;i<=qwq[k].cnt;i++){//遍历该点所有边
		if(!vst[qwq[k].l[i]]){//没访问过,向下走 
			fa[qwq[k].l[i]]=k;	dfs(qwq[k].l[i],d+1);
		}
	}
	return;
}
int lg(int a){
	int tmp=0;
	for(;a>1;a=a>>1){
		tmp++;
	}
	return tmp;
}
void bez(int a,int b){
	while(sd[a]<sd[b]){//cout<<sd[a]<<"<<<"<<sd[b]<<endl;
		b=bz[b][lg(sd[b]-sd[a])];
	}
//cout<<"!!!"<<a<<"!!!"<<b<<endl;
	if(a==b){
		printf("%d\n",a);	return;
	}
	int f=0;	bool awa=0;
	while(a!=b){
		while(bz[a][f]==bz[b][f]){//如果下次倍增到达同一节点 
			if(f)	f=f>>1;//如果f不为0,倍增跨度缩小一点点 
			else	{//如果为0,说明再向上一格就到了 
				printf("%d\n",bz[a][0]);	return;
			}
			awa=1;
		}
		a=bz[a][f];	b=bz[b][f];//节点向上挪
		if(!awa)	f=f<<1;
	}
	return;
}
int main(){
	scanf("%d%d%d",&n,&m,&s);
	int a,b;
	for(int i=1;i<=n-1;i++){
		scanf("%d%d",&a,&b);
		qwq[a].cnt++;	qwq[a].l[qwq[a].cnt]=b;
		qwq[b].cnt++;	qwq[b].l[qwq[b].cnt]=a;
	}//存双向边
	dfs(s,1);//预处理深度 
/*for(int i=1;i<=n;i++){
	for(int j=0;j<=4;j++)	cout<<bz[i][j]<<" ";
	cout<<" sd["<<i<<"]="<<sd[i]<<endl;
}*/
	int q;
	for(int i=1;i<=m;i++){
		scanf("%d%d",&a,&b);
		if(a==b){
			printf("%d\n",a);
			continue;
		}
		if(sd[a]>sd[b]){//cout<<"??"<<endl;
			bez(b,a);
		}
		else	bez(a,b);
	}
	return 0;
}

RT QWQ

2023/11/7 19:07
加载中...