https://codeforces.com/problemset/problem/1383/B
思路:
开始以为是带博弈类的dp..发现不是...
首先贪心,问题转化成了谁先拿到二进制的最高位。于是我们先把按照位数从高到低把每一个位的1的个数处理出来。
如果该位是1个,那么先手获胜。
如果该位是2个,那么先手取1,不管后面的剩余个数是奇数,还是偶数,总会回到先手取下一个1或者后手取下一个1的状态,所以如果个数%2==0.那么当前高位对于两者得分没有影响。
如果该位是3个,那么先手先取1,后手取1,谁先取最后一个1谁就输。后者暂时不取1,到后面再取(反正先手一旦取到1后手跟着取1就赢了)
如果剩下的个数是奇数,我后手不管怎么取,都要取到最后一个1——先手必胜。
如果剩下的个数是偶数,我先手不管怎么取,都要取到最后一个1——先手必败。
如果该位是4个,不管咋样会回到该位是2的状态,无所谓。
如果该位是5.我先手直接取1,剩下4个就回到了上述位数个数为4的状态,那么先手必胜了。
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=1e5+1000;
typedef long long LL;
inline LL read(){LL x=0,f=1;char ch=getchar(); while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;}
LL a[maxn];
LL num[70];
int main(void){
cin.tie(0);std::ios::sync_with_stdio(false);
LL t;cin>>t;
while(t--){
LL n;cin>>n;
for(LL i=1;i<=n;i++) cin>>a[i];
memset(num,0,sizeof(num));
for(LL i=0;i<=60;i++){
for(LL j=1;j<=n;j++){
if(a[j]&(1LL<<i)){
num[i]++;
}
}
}
bool flag=1;
for(LL i=60;i>=0;i--){
if(num[i]%2==0){
continue;
}
else if(num[i]%4==1){
flag=0;
cout<<"WIN"<<"\n";
break;
}
else if(num[i]%4==3){
LL cnt=n-num[i];
if(cnt%2==0){
flag=0;
cout<<"LOSE"<<"\n";
break;
}
else if(cnt&1){
flag=0;
cout<<"WIN"<<"\n";
break;
}
}
}
if(flag){
cout<<"DRAW"<<"\n";
}
}
return 0;
}