爆零求助/qwq
查看原帖
爆零求助/qwq
227728
冰糖鸽子「僕は…」楼主2021/1/31 15:42

RT,倍增LCA,样例过了但全WA


// Problem: P3398 仓鼠找sugar
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3398
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// Powered by CP Editor (https://github.com/cpeditor/cpeditor)

#include <bits/stdc++.h>
using namespace std;
#define M 100005
int n,m,U,V,d[M],cntt,lf[20][M],a,b,c,e,f,dd,vis[M];
vector<int>road[M];
void dfs(int x)
{
	cntt++;
	for(int i=0;i<road[x].size();i++)
	{
		if(d[road[x][i]]) continue;
		d[road[x][i]]=d[x]+1;
		lf[0][road[x][i]]=x;
		dfs(road[x][i]);
	}
}
void Re(int x)
{
	vis[x]=1;
	for(int i=log2(d[x]);i>0;i--)
	{
		lf[i][x]=lf[i-1][lf[i-1][x]];
	}
	for(int i=0;i<road[x].size();i++)
	{
		if(!vis[road[x][i]]) Re(road[x][i]);
	}
}
int lowbit(int x)
{
	return x & -x;
}
int LCA(int x,int y)
{
	int dx=d[x],dy=d[y],fc=dx-dy,k;
	if(fc<0)
	{
		swap(dx,dy);
		swap(x,y);
		fc=-fc;
	}
	while(fc)
	{
		k=lowbit(fc);
		fc-=k;
		k=log2(k);
		x=lf[k][x];
	}
	if(x==y) return x;
	for(int i=log2(dy);i>=0;i--)
	{
		if(lf[i][x]!=lf[i][y])
		{
			x=lf[i][x];
			y=lf[i][y];
		}
	}
	return lf[0][x];
}
int lth(int x,int y)
{
	int L=LCA(x,y),res=0;
	res+=d[x]-d[L];
	res+=d[y]-d[L];
	return res;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<n;i++)
	{
		cin>>U>>V;
		road[U].push_back(V);
		road[V].push_back(U);
	}
	d[1]=1;
	dfs(1);
	Re(1);
	for(int i=1;i<=m;i++)
	{
		cin>>a>>b>>c>>dd;
		if(d[b]>d[a]) swap(a,b);
		if(d[dd]>d[c]) swap(c,dd);
		e=LCA(a,b);
		f=LCA(c,dd);
		if((lth(c,e)+lth(dd,e)==lth(c,dd))||(lth(f,a)+lth(f,b)==lth(a,b)))
		{
			cout<<"Y"<<endl;
		}
		else
		{
			cout<<"N"<<endl;
		}
	}
	return 0;
}
2021/1/31 15:42
加载中...