HDU6324(博弈+异或)

 这道题目考查了异或运算的性质:
一.异或运算的性质
前提:异或运算的规则:
x^x=0(1-a);0^x=x(1-b);
1.交换律
2.结合律:a^b^c=a^(b^c)=(a^b)^c
结合律使得异或运算具有分块的特点,我们看一下结合律的
强大作用
假设a1^a2^...an=b
(1)如果b==0:则由于异或运算满足规则(1-a)又因为异或运算
满足结合律,所以我们得到结论:
任意一个异或符号两端分块运算的结果相同
(2)如果b!=0:那么我们也可以得到结论:
任意一个异或符号两端的分块运算结果一定不同
那么假设分块A1^A2=b,一定有A1!=A2
那么有A1>A2或者A1<A2
二.异或运算在本题中的应用
只要最终所有顶点的异或结果不为0,
那么Q可以将A=max(A1,A2)取走即可
如果异或结果为0,则是平局,程序如下:

#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=1e5+5;
int t,n,xorsum;
int w[maxn],v,u;
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        xorsum=0;
        for(int i=1; i<=n; i++)
        {
            scanf("%d",&w[i]);
            xorsum^=w[i];
        }
        for(int i=1;i<=n-1;i++)
            scanf("%d%d",&v,&u);
        if(xorsum==0)printf("D\n");
        else printf("Q\n");
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41658955/article/details/81414049