最开始没有读清楚题,理解的是每个点的权值和它的编号相异或最后求和…后来又看成每个点编号异或的和(然后中间有一遍读入循环里i的边界写错了给T了)。题目的意思是
The final score of each player is the bitwise XOR sum of his choosen vertices’ value.
不过不管理解的是那种题意,都是借助异或的性质。因为是不能选相邻的点,异或值又是大于等于零的,所以只要我选上这个它不会是零,那肯定要往多里选,这样T Q其实能选的就是两部分。而如果两边值不为零,先手肯定可以选走值更大的,所以先手必胜。为零的情况就会平局。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int T;
ll ans;
int main()
{
scanf("%d", &T);
while(T)
{
int n;
ans = 0;
scanf("%d", &n);
for(int i = 1;i <= n;i++)
{
int x;
scanf("%d", &x);
ans = ans^x;
}
for(int i = 1;i <= n-1;i++)
{
int u, v;
scanf("%d%d", &u, &v);
}
if(ans == 0)
printf("D\n");
else
printf("Q\n");
T--;
}
return 0;
}