[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;
}
posted @ 2018-10-10 18:39  skylee03  阅读(245)  评论(0编辑  收藏  举报