C. Game On Leaves(博弈论)

一、问题

在这里插入图片描述

二、分析

这道题简单来说,就是给我们一棵树,以及一个特殊点,每一次我们能够删除一个叶子节点,Ayush先手,谁能够最终删除这个特殊的节点,谁就是赢家。

这个特殊点记作: X X X

我们最终一定是到下图的情况时判断输赢:
在这里插入图片描述
当我们的 x x x出度为0的时候,此时轮到谁出手,谁就是赢家。

我们以下的讨论先排除 x x x的子节点个数是0的情况。

case1: x x x是祖宗节点

我们先考虑一下简单的情况,我们假设 x x x就是祖宗节点:那么我们必须删除除了 x x x外的(所有点 - 1)个点,才能删除 x x x。此时,我们只需要关注一下 x x x下面的子节点个数。如果,

当前 x x x的子节点个数是奇数,那么先手赢,如果当前 x x x的子节点是偶数,则先手必输。

case2: x x x不是祖宗节点

接着,我们考虑 x x x不是祖宗节点的条件下输赢的情况,我们还是分两类。

(1) x x x的子节点是偶数

如果此时 x x x的子节点是偶数。

在这种条件下我们刚刚的结论其实还是成立的。如果其中一个人是先手,而此时 x x x的子节点是偶数,此时先手必输,但是我们可以不删除 x x x的子节点,而是删除其他的子节点,这样就把先手必输的状态转移给了对方。

那么同理对方也可以采取同样的方式将先手必输的状态再次转移,这样循环往复,直到整棵树中只剩下以 x x x为根的子树。

那么此时,如果除了 x x x的子树外(包括 x x x),剩余的节点的数量如果是偶数的话,其实最后二者转移来转移去,一开始谁是先手必输,最后还是谁先手必输。
如果这些节点的数量是奇数的话,那么一开始的先手必输状态,在最后就i转变成了先手必赢的状态。

简单的来讲,在 x x x的子树(包括 x x x)的子节点个数是偶数的时候,如果其他节点的数目是奇数,则先手必赢,如果其他节点的数目是偶数的话,则先手必输。

所以,此时我们需要考虑的是其余节点的奇偶性。

(2) x x x的子节点是奇数

如果此时 x x x的节点数是奇数。

在这种条件下, 先手处于必赢状态,此时我们一定是从 x x x的子树中减去一个,然后让对手处于先手必败的状态,然后再重复刚刚的过程。

如果我们将除了 x x x的子树(包括 x x x)的点外的其余点的个数记录为 n u m s nums nums的话,我们就需要讨论的是 n u m s + 1 nums+1 nums+1的奇偶性。

如果这个式子是奇数,则先手必赢,如果这个式子是偶数则先手必输。

那么无论x的子节点是奇还是偶,我们可以用一个式子表达出来,我们判断的是 n u m s + ! s i z ( x ) % 2 nums+!siz(x)\%2 nums+!siz(x)%2的奇偶性。如果这个式子是偶数,先手必赢,如果这个式子是奇数,先手必输。

接着,我们考虑一下,这两种 c a s e case case能否融合在一起?

如果我们把 c a s e 1 case1 case1的情况套入 c a s e 2 case2 case2中,此时这个式子中的 n u m s nums nums就是0,按照 c a s e 1 case1 case1中的结论,如果是奇数,就是必输,放到 c a s e 2 case2 case2中,奇数取反变成 0 0 0,按照 c a s e 2 case2 case2偶数必输。发现二者得出的结论是一样的

因此,我们就只需要利用这一个式子: n u m s + ! s i z ( x ) % 2 nums+!siz(x)\%2 nums+!siz(x)%2的奇偶性, 即可判断。这个式子是奇数,先手必输,这个式子是偶数,先手必赢。

但是写到这里,我们发现这道题是一个无根树,所以我们很难去统计,因此,我们看看上述的这个表达式能否化简。

首先我们发现 s i z ( x ) + n u m s = n − 1 siz(x) + nums=n-1 siz(x)+nums=n1,因为 s i z ( x ) siz(x) siz(x)指的是不包括 x x x的子节点, n u m s nums nums指的是其他点,所以相当于没算 x x x,即 n − 1 n-1 n1

那么如果 n − 1 n-1 n1是偶数的话,要么这两部分都是偶数,要么这两部分都是奇数。

如果这两部分都是偶数的话,刚才的式子就是奇数,如果两个式子都是奇数的话,刚才的式子还是奇数。
如果 n − 1 n-1 n1是奇数的话,那么只能是奇数+偶数,如果左边部分是奇数,右边部分是偶数,这个式子就是偶数,如果左边部分是偶数,右边部分是奇数,这个式子还是偶数。

因此,如果 n − 1 n-1 n1是偶数,这个式子就是奇数,先手必输。
如果 n − 1 n-1 n1是奇数,这个式子就是偶数,先手必赢。

但是!有一种特殊情况,如果 x x x的度小于等于1的时候,不管这个式子的奇偶性是什么,都是先手必赢。

三、代码

#include<bits/stdc++.h>
#define endl '\n'
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N = 1e3 + 10;

void solve()
{
	int n,x;
	cin >> n >> x;
	int dex = 0;
	for(int i = 0; i < n - 1; i ++ )
	{
		int a, b;
		cin >> a >> b;
		if(a == x || b == x)
			dex ++;		
	}
	if(dex <= 1)
	{
		cout << "Ayush" << endl;
		return;
	}

	if((n - 1) % 2)
	{
		cout << "Ayush" << endl;
	}
	else
	{
		cout << "Ashish" << endl;
	}
	return;

}

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin >> t;
	while(t -- )
	solve();
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值