codeforces1404Bツリータグ

https://codeforces.com/problemset/problem/1404/B

ボブが勝つために必要かつ十分な条件、dist(a、b)> da && db> = 2 * da + 1 && diameter> = 2 * da + 1

3つめの条件について長い間考えていたのですが、それを証明することはできず、結局は推測しました。おそらくdb> = 2 * da + 1であるため、bの方向にジャンプし、dist(a、b)> daであるため、bはaが到達できない位置にジャンプできなければなりません。 bは、aに遮られることなく、常に直径の端にジャンプできます。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int maxl=3e5+10;

int n,m,da,db,a,b,cnt,tot,cas,ans;
bool flag;
int tmp[maxl],dis[maxl],disa[maxl],disb[maxl];
int mx[maxl],sec[maxl];
vector<int> e[maxl];
bool vis[maxl];
char s[maxl];

inline void upd(int u,int x)
{
	if(x>mx[u])
		sec[u]=mx[u],mx[u]=x;
	else if(x>sec[u])
		sec[u]=x;
}

inline void dfs1(int u,int fa)
{
	for(int v:e[u])
	{
		if(v==fa) continue;
		dfs1(v,u);
		upd(u,mx[v]+1);
	}
}

inline void dfs2(int u,int fa,int fadis)
{
	upd(u,fadis);
	int tmp;
	for(int v:e[u])
	{
		if(v==fa) continue;
		if(mx[v]+1==mx[u])
			tmp=sec[u];
		else 
			tmp=mx[u];
		tmp=max(tmp,fadis)+1;
		dfs2(v,u,tmp);
	}
}

inline void prework()
{
	scanf("%d",&n);
	scanf("%d%d%d%d",&a,&b,&da,&db);
	for(int i=1;i<=n;i++)
		e[i].clear(),mx[i]=0,sec[i]=0;
	int u,v;
	for(int i=1;i<n;i++)
	{
		scanf("%d%d",&u,&v);
		e[u].push_back(v);
		e[v].push_back(u);
	}
	dfs1(1,0);
	dfs2(1,0,0);
}

inline void dfs(int u,int dis[])
{
	vis[u]=true;
	for(int v:e[u])
	if(!vis[v])
	{
		dis[v]=dis[u]+1;
		dfs(v,dis);
	}
}

inline void mainwork()
{
	ans=1;
	if(db<2*da+1)
		return;
	for(int i=1;i<=n;i++) vis[i]=false,disa[i]=0;
	dfs(a,disa);
	for(int i=1;i<=n;i++) vis[i]=false,disb[i]=0;
	dfs(b,disb);
	if(disa[b]<=da)
		return;
	int mxx=0;
	for(int i=1;i<=n;i++)
		mxx=max(mxx,mx[i]);
	if(mxx>=2*da+1)
		ans=0;
}

inline void print()
{
	if(ans)
		puts("Alice");
	else
		puts("Bob");
}

int main()
{
	int t=1;
	scanf("%d",&t);
	for(cas=1;cas<=t;cas++)
	{
		prework();
		mainwork();
		print();
	}
	return 0;
}

 

おすすめ

転載: blog.csdn.net/liufengwei1/article/details/108441282