HDU 6324 Grab The Tree 异或

Problem Description
Little Q and Little T are playing a game on a tree. There are n vertices on the tree, labeled by 1,2,...,n, connected by n−1 bidirectional edges. The i-th vertex has the value of wi.
In this game, Little Q needs to grab some vertices on the tree. He can select any number of vertices to grab, but he is not allowed to grab both vertices that are adjacent on the tree. That is, if there is an edge between x and y, he can't grab both x and y. After Q's move, Little T will grab all of the rest vertices. So when the game finishes, every vertex will be occupied by either Q or T.
The final score of each player is the bitwise XOR sum of his choosen vertices' value. The one who has the higher score will win the game. It is also possible for the game to end in a draw. Assume they all will play optimally, please write a program to predict the result.
 

Input
The first line of the input contains an integer T(1≤T≤20), denoting the number of test cases.
In each test case, there is one integer n(1≤n≤100000) in the first line, denoting the number of vertices.
In the next line, there are n integers w1,w2,...,wn(1≤wi≤109), denoting the value of each vertex.
For the next n−1 lines, each line contains two integers u and v, denoting a bidirectional edge between vertex u and v.
 

Output
For each test case, print a single line containing a word, denoting the result. If Q wins, please print Q. If T wins, please print T. And if the game ends in a draw, please print D.
 

Sample Input
1
3
2 2 2
1 2
1 3
 

Sample Output
Q

题意:一个树上n个节点,一个人先选一些,但是不可以将父子节点都选,然后剩下的归另外一个人,看他们的谁的异或和大,或者将出现平局,双方足够聪明

思路:其实这个题目和树没有关系,因为异或的特殊关系,所以只存在先手胜利和平局,是否平局求异或即可,为0则证明可以平局

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
#include <cmath>
using namespace std;
const int maxn=5e+5;
typedef long long ll;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
       int n,a,b,sum=0,flag=0;
       scanf("%d",&n);
       for(int i=1;i<=n;i++)
       {
           scanf("%d",&a);
           sum=sum^a;
       }
       //printf("%d\n",sum);
       if(sum==0)
        flag=1;
       for(int i=1;i<n;i++)
        scanf("%d%d",&a,&b);
       if(!flag)
        printf("Q\n");
       else
        printf("D\n");
    }

}

猜你喜欢

转载自blog.csdn.net/deepseazbw/article/details/81348024