社区讨论

【求助各位大佬】TLE两个点

P3398仓鼠找 sugar参与者 4已保存回复 8

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
8 条
当前快照
1 份
快照标识符
@mi7pfsbj
此快照首次捕获于
2025/11/21 01:28
4 个月前
此快照最后确认于
2025/11/21 01:28
4 个月前
查看原帖
代码如下: 使用的倍增LCA:
CPP
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define Max 100005
using namespace std;
int next[2*Max],fir[2*Max],to[2*Max],tot;
int f[Max][15],log_2[Max],dep[Max];
int n,q,u,v,a,b,c,d;
inline void Add(int x,int y){
	next[++tot]=fir[x];fir[x]=tot;to[tot]=y;
}
inline void dfs(int now,int fa){
	dep[now]=dep[fa]+1;f[now][0]=fa;
	for(register int i = 1 ; (1<<i)<=dep[now]; ++i){
		f[now][i]=f[f[now][i-1]][i-1];
	}
	for(register int i = fir[now]; i ; i= next[i]){
		if(to[i]!=fa)dfs(to[i],now);
	}
}
void presolve(){
	for(register int i = 1 ; i <= Max ; ++i ){
		log_2[i]=log_2[i-1]+(1<<log_2[i-1]==i);
	}
	dfs(1,0); 
}
inline int LCA(int x,int y){
	if(dep[x]<dep[y])swap(x,y);
	while(dep[x]>dep[y]){
		x=f[x][log_2[dep[x]-dep[y]]-1];
	}
	if(x==y)return x;
	int D = dep[x];
	for(register int i = log_2[D]-1;i>=0;--i){
		if(f[x][i]!=f[y][i]){
			x=f[x][i];y=f[y][i];
		}
	}
	return f[x][0];
}
void solve(){
	int A=LCA(a,b),B=LCA(c,d);
	if(dep[A]<dep[B]){
		swap(A,B);
		swap(a,c);
		swap(b,d);
	}
	if(LCA(A,c)==A||LCA(A,d)==A)putchar('Y');
	else putchar('N');
	putchar('\n');
	return;
}
int read(){
	int res=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-')f=-1;
		c=getchar(); 
	}
	while('0'<=c&&c<='9'){
		res=(res<<3)+(res<<1)+c-'0';
		c=getchar();
	}
	return f*res;
}

int main(){
	n=read();q=read();
	for(register int i = 1 ; i <= n-1; ++i){
		u=read();v=read();
		Add(u,v);Add(v,u);
	}
	presolve();
	for(register int i = 1 ; i <= q; ++i){
		a=read();b=read();c=read();d=read();
		solve();
	}
	return 0;
}

回复

8 条回复,欢迎继续交流。

正在加载回复...