Codeforces 1221 E Game With String

题面

 

   第一眼以为是SG函数找规律题,然后发现并不是公平游戏。。。。

   不过后来想了想,其实这样反而更好做。

 

    这个游戏的一个显然的特性是,任何时候当场上存在长度 ∈[b,a)的块时,Bob必胜。(考虑贪心)

    而这题的关键是发现,如果Bob操作时场上还有长度>=2b的块,那么Bob也必胜,因为Bob此时可以构造出一个长度为b的块。

 

    剩下的剩下就是暴力分情况讨论了,看起来是思路已经明确了,但是细节暴多。。。。留给你们自己思考吧w

 

#include<bits/stdc++.h>
#define ll long long
using namespace std;

inline int read(){
	int x=0; char ch=getchar();
	for(;!isdigit(ch);ch=getchar());
	for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
	return x;
} 

bool fl;

inline int Get(){
	int x=0; char ch=getchar();
	for(;ch=='.';ch=getchar()) x++;
	if(ch=='\n') fl=1;
	return x;
}

int Q,a,b,now;

inline bool solve(){
	a=read(),b=read();
	
	int BA=0,BB=0,DB=0,mx=0;
	for(fl=0;!fl;) now=Get(),BA+=now>=a,BB+=now>=b,DB+=now>=b*2,mx=max(mx,now);
	
	if(BB>BA) return 0;
	if(a>=2*b) return BA==1&&mx<=a+2*b-2;
	if(mx>a+4*b-2||DB>1) return 0;
	if(DB) return ((BA&1)&&(mx>=3*a||mx<=a+2*b-2))||(!(BA&1)&&mx>=2*a&&mx<=a+3*b-2);
	return BA&1;
}

int main(){
	for(Q=read();Q;Q--) puts(solve()?"YES":"NO");
	return 0;
}

/*
    [b,a)
    只要轮到Bob操作的时候,场上存在>=2b的块,那么Bob必胜 !
	
	1.a>=2b 这样比较惨,只能Alice第一次有填的并且填完之后所有都<b
	
	2.a∈[b+1,2b-1] 正常情况,当且仅当场上只有一块>=2b的且 len<=a+4b-2
	
*/

  

posted @ 2019-09-22 10:45  蒟蒻JHY  阅读(484)  评论(0编辑  收藏  举报