HDU 6324 Grab The Tree(思维)

题目链接:Grab The Tree

题意

Q Q 和小 T 玩一个游戏,在一棵 n n 个节点的树上,每个节点都有一个权值 wi,由小 Q Q 先开始选点,小 Q 选择的点中,任意两个节点不能同时为某条边的两个端点,之后剩下的点全是小 T T 的,小 Q 的最终分数就是他所选择的所有点的权值异或值,小 T T 的分数也是他拥有的点的权值异或值,问在小 Q 采取最优策略的情况下,谁会获胜,还是平局。

输入

第一行包含一个整数 T (1T20) T   ( 1 ≤ T ≤ 20 ) ,接下去有 T T 组数据,每组数据第一行为一个整数 n (1n105),第二行为 n n 个整数 w1,w2,,wn (1wi109),接下去 n1 n − 1 行每行两个整数 u,v (1u,vn) u , v   ( 1 ≤ u , v ≤ n ) ,表示节点 u,v u , v 之间有一条边。

输出

如果小 Q Q 会获胜,则输出 Q,如果小 T T 会获胜,则输出 T,否则输出 D D

样例

输入
1
3
2 2 2
1 2
1 3
输出
Q

题解

如果树上所有点的异或值为 0,无论小 Q Q 如何选点,小 T 的分数都会和小 Q Q 的分数相等,如果树上所有点的异或值非 0,则小 Q Q 只需要选择最大值,就可以让树上所有其他点异或值的最高位小于小 Q 选择的点的权值,小 Q Q <script type="math/tex" id="MathJax-Element-31">Q</script> 必胜。

过题代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <cstring>
#include <string>
#include <vector>
#include <list>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <bitset>
#include <algorithm>
#include <functional>
#include <iomanip>
#include <unordered_set>
#include <unordered_map>
using namespace std;

#define LL long long
int T, n, num, Xor, u, v;

int main() {
    #ifdef LOCAL
        freopen("test.txt", "r", stdin);
//    freopen("out.txt", "w", stdout);
    #endif // LOCAL
    ios::sync_with_stdio(true);

    scanf("%d", &T);
    while(T--) {
        Xor = 0;
        scanf("%d", &n);
        for(int i = 0; i < n; ++i) {
            scanf("%d", &num);
            Xor ^= num;
        }
        for(int i = 1; i < n; ++i) {
            scanf("%d%d", &u, &v);
        }
        if(Xor == 0) {
            printf("D\n");
        } else {
            printf("Q\n");
        }
    }

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值