社区讨论

本题全网第一个90分求调

P3398仓鼠找 sugar参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@m3eftx0l
此快照首次捕获于
2024/11/12 20:37
去年
此快照最后确认于
2024/11/12 20:51
去年
查看原帖
目光所及之处真的没有找到一个同分的
CPP
#include<bits/stdc++.h>
using namespace std;
int n,q,f[100005][35],dep[100005],l[100005];
vector<int> v[100005];
int lowbit(int i)
{
	return i & -i;
}
void dfs(int now,int fa)
{
	f[now][0]=fa; dep[now]=dep[fa]+1;
	for(register int i=1;i<=l[dep[now]-1];++i)
		f[now][i]=f[f[now][i-1]][i-1];
	for(register int i=0;i<v[now].size();++i)
	{
		int to=v[now][i];
		if(to==fa) continue;
		dfs(to,now);
	}
}
int lca(int x,int y)
{
	if(dep[x]<dep[y]) swap(x,y);
	while(dep[x]!=dep[y]) x=f[x][l[dep[x]-dep[y]]];
	if(x==y) return x;
	for(register int i=l[dep[x]-1];i>=0;--i)
		if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
	return f[x][0];
}
int main()
{
	std::ios::sync_with_stdio(false);
	cin>>n>>q; l[0]=-1;
	for(register int i=1;i<n;++i)
	{
		int x,y;
		cin>>x>>y;
		v[x].push_back(y),v[y].push_back(x);
		l[i]=l[i-1]+(lowbit(i)==i);
	}
	dfs(1,0);
	for(register int i=1;i<=q;++i)
	{
		int a,b,c,d;
		cin>>a>>b>>c>>d;
		int fab=lca(a,b),fcd=lca(c,d);
		if(dep[fab]>dep[fcd])
			if(lca(fab,c)==fab||lca(fab,d)==fab) cout<<"Y\n";
			else cout<<"N\n";
		else if(dep[fab]==dep[fcd]) cout<<"Y\n";
		else
			if(lca(fcd,a)==fcd||lca(fcd,b)==fcd) cout<<"Y\n";
			else cout<<"N\n";
	}
	return 0;
} 

回复

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

正在加载回复...