第一眼以为是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
*/
Codeforces 1221 E Game With String
原文:https://www.cnblogs.com/JYYHH/p/11566607.html