NC231375. Move Pieces
描述
现在 Alice 和 Bob 轮流操作,他们都会采取最优策略,问谁能赢?Alice 先手。有组数据。
输入描述
The first line contains a integer , the number of test cases.
For each test case, the first line contains a integer , denoting the number of nodes.
Each of the next lines contains two integers. The -th line describes the -th edge containing two integers and , indicating the nodes connected by the -th edge.It is guaranteed that the sum of all among a single test file is not greater than .第一行一个正整数 ,表示数据组数。对于每组数据,第一行一个整数 。
接下来 行,每行两个整数 和 ,描述一条树边。题目保证,所有数据的 的和不超过 .
输出描述
For each testcase, output a line consisting of a single string or , representing the name of the winner.对于每组数据,输出一行一个字符串表示答案。如果 Alice 能赢,输出 ,如果 Bob 能赢,输出 .
示例1
输入:
4 2 2 1 1 5 1 2 3 1 2 4 5 2 4 1 2 1 3 1 4
输出:
Alice Bob Alice Alice
C++ 解法, 执行用时: 274ms, 内存消耗: 23840K, 提交时间: 2022-04-27 21:54:20
#include<bits/stdc++.h> using namespace std; const int N=200005; int n,T; vector<int>g[N]; inline int lob(int x){ return x&(-x); } pair<int,int> dfs(int u,int fa){ int x=0,y=0; for(int v:g[u]){ if(v==fa)continue; auto tmp=dfs(v,u); int i=tmp.first,j=tmp.second; x^=i; y|=j; } int z=lob((~x)&(~y)); x=(x/z+1)*z; y=(y/z+1)*z; return make_pair(x,y); } int main(){ cin>>T; while(T--){ cin>>n; for(int i=1;i<=n;i++){ g[i].clear(); } for(int i=1,u,v;i<n;i++){ cin>>u>>v; g[u].push_back(v); g[v].push_back(u); } int ans=0; for(int u:g[1]){ ans^=dfs(u,1).first; } if(ans==0)cout<<"Bob"<<endl; else cout<<"Alice"<<endl; } return 0; }