3个点MLE求救Orz
查看原帖
3个点MLE求救Orz
130104
loris楼主2021/6/29 12:59
#include<bits/stdc++.h>
using namespace std;
int n,q,u,v,a,b,c,d,fa[100001][21],nxt[100005],head[100005],to[100005],tot,dep[100005];
void add(int u,int v)
{
	nxt[++tot]=head[u];
	head[u]=tot;
	to[tot]=v;
}
void build(int rt,int deep)
{
	dep[rt]=deep;
	for(int i=head[rt];i;i=nxt[i])
	{
		if(to[i]!=fa[rt][0])
		{
			fa[to[i]][0]=rt;
			build(to[i],deep+1);
		}
	} 
}
int getf(int now)
{
	for(int i=1;i<=20;i++)
		if(dep[now]-(1<<i)>=1)
			fa[now][i]=fa[fa[now][i-1]][i-1];
	for(int i=head[now];i;i=nxt[i])
		if(to[i]!=fa[now][0])
			getf(to[i]);
}
int lca(int u,int v)
{
	if(dep[v]>dep[u])swap(u,v);
	
	for(int i=20;i>=0;i--)
		if(dep[u]-(1<<i)>=dep[v])
			u=fa[u][i]; 
	if(u==v)return u;
	for(int i=20;i>=0;i--)
		if(fa[u][i]!=fa[v][i])
			u=fa[u][i],v=fa[v][i];
	return fa[u][0];
}
int getl(int u,int v,int _lca)
{
	return dep[u]-dep[_lca]+dep[v]-dep[_lca];
}
bool deal()
{
	int lca1=lca(a,c),lca2=lca(b,d),lca3=lca(a,b),lca4=lca(c,d);
	if(getl(a,c,lca1)+getl(b,d,lca2)<=getl(a,b,lca3)+getl(c,d,lca4))
		return 1;
	else 
		return 0;
}
void out(bool bb)
{
	if(bb) cout<<'Y'<<endl;
	else cout<<'N'<<endl;
}
int main()
{
	cin>>n>>q;
	for(int i=1;i<=n;i++)
		fa[i][0]=i;
	for(int i=1;i<=n-1;i++)
	{
		cin>>u>>v;
		add(u,v);
		add(v,u);
	}
	build(1,1);
	fa[1][0]=0;
	getf(1);
	for(int i=1;i<=n;i++)
	{
		cin>>a>>b>>c>>d;
		out(deal());
	}
	return 0;
}
2021/6/29 12:59
加载中...