hdu Multi-University Training Contest 3 Problem F. Grab The Tree(博弈决策+思维)

这个题拿上来还挺吓人的,题目里套了个树,刚开始可能会想到搜索,图论这些内容,但是后来一看这个点最大是10万个,然后就可以知道这个绝对不是建图做了,大概就是个思维题。

题意是给你一个生成树,每个点都有权,一个人先选择树上的若干个点,但是不能选择相邻的两个结点(这个条件是没有用的,就是为了迷惑人),然后第一个人的得分是他选的所有结点的异或,另一个人的得分是剩下点的异或,得分大者胜利。

首先考虑一下如果所有点异或值为0,那么很明显无论怎么选择,这两个人最后的得分一定会相等(这个结论可以从异或这个运算满足交换律和结合律推出来),所以是平局。

然后如果异或值不是0,那么先手必胜,第一个人选择一个结点就行了,所有从头到尾我们都没有用到相邻结点不能选择这个条件。

分析一下为什么先手会必胜:我们把所有点的异或写成二进制,找到该位是1的最高位,然后我们肯定可以从原来的结点里找到一个这一位同样是1的结点,然后其他结点的这一位在异或运算后一定是0,这个也很明显。因为这一位是0,其他结点异或以后得到的结果肯定要比这个结点的权值要小了,所以我们已经得到了答案。

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

int main()
{
    int t,n,tem,sum,a,b;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        scanf("%d",&sum);
        for(int i=1; i<n; i++)
        {
            scanf("%d",&tem);
            sum^=tem;
        }
        for(int i=1; i<n; i++)
            scanf("%d%d",&a,&b);
        if(sum==0)
            printf("D\n");
        else printf("Q\n");
    }
}

猜你喜欢

转载自blog.csdn.net/zero___zero/article/details/81294908