[SDOI2009]E&D
[SDOI2009]E&D
题目大意:
有\(2n(n\le2\times10^4)\)堆石子,第\(i\)堆石子有\(x_i\)个,第\(2k\)与第\(2k+1\)堆为一组。每次选取一组,移除其中一堆,并从另一堆石子中取出若干颗放到被移除的位置上。操作过程中需要保证任意一堆石子个数为正,两人轮流操作,不能操作者负,问若两人都按照最优策略,最后谁能取胜?
思路:
每组石子是一个相对独立的游戏,对于每组两堆石子的个数暴力计算SG函数并打表,发现后继状态SG值集合\(S\)用二进制表示的结果为\((x_1-1)\vee(x_2-1)\)。
证明略。
源代码:
#include<cstdio>
#include<cctype>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
int main() {
for(register int T=getint();T;T--) {
const int n=getint()>>1;
int sg=0;
for(register int i=0;i<n;i++) {
int s=(getint()-1)|(getint()-1),mex=0;
for(;s&1;s>>=1) mex++;
sg^=mex;
}
puts(sg?"YES":"NO");
}
return 0;
}