题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6324
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 .
Input The first line of the input contains an integer T(1≤T≤20) , denoting the number of test cases.
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个顶点,由1,2,…,n标记,n-1个双向边连接。第i个顶点具有Wi的值。小Q需要抓取树上的一些顶点。他可以选择任意数量的顶点来抓取,但是不允许他抓取树上相邻的两个顶点。也就是说,如果X和Y之间有一个边,他不能同时抓住X和Y。Q移动之后,小T将抓住所有其余顶点。每个玩家的最终分数是他选择顶点的值的位异或。因为位异或的结果一定不大于两者中最大的那个,所以排序后讲最大的给小Q,剩下的全部给小T,然后比较结果。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int m[100005];
int main()
{
int a,b,c,d,e;
cin>>a;
while(a--)
{
scanf("%d",&b);
for(c=0;c<b;c++)
scanf("%d",&m[c]);
for(c=1;c<b;c++)
scanf("%d %d",&d,&e);
sort(m,m+b);
d=m[0];
for(c=1;c<b-1;c++)
d=d^m[c];
if(d>m[b-1])
cout<<"T"<<endl;
else if(d<m[b-1])
cout<<"Q"<<endl;
else if(d==m[b-1])
cout<<"D"<<endl;
}
return 0;
}