小言_互联网的博客

E - Game With String(数学 博弈)

274人阅读  评论(0)

original link - http://codeforces.com/contest/1221/problem/E

题意:

给出一个 . X ''.X'' 串,两个人做游戏,第一个人一次要填 a a 个连续的 . '.' ,第二个人 b b 个连续的 . '.'

谁不能填就输了,问第一个人的输赢。保证 a > b a>b

解析:

有点难想,有点意思。

我们考虑如果第二个人手上有一段 [ b , a 1 ] [b,a-1] . '.' ,那么显然第二个人就赢了。(如果有其他的,就填其他的,如果没有我才用这段,而因为 a > b a>b 所以之后第一个人也没有地方可以填了)

第二个可以通过一段长度大于等于 2 b 2b 的段去造出 [ b , a 1 ] [b,a-1] ,所以第一个人要在第一次填完后不能存在长度大于大于 2 b 2b 的段。

如果有两段大于等于 2 b 2b 的话,百分百不行;如果只有一段,我们可以去枚举填每个位置下的情况;如果没有,就看看剩下的两个人都可以填的段的数量的奇偶性。

代码:

/*
 *  Author : Jk_Chen
 *    Date : 2019-09-23-16.13.54
 */
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define rep(i,a,b) for(int i=(int)(a);i<=(int)(b);i++)
#define per(i,a,b) for(int i=(int)(a);i>=(int)(b);i--)
#define mmm(a,b) memset(a,b,sizeof(a))
#define pb push_back
#define pill pair<int, int>
#define fi first
#define se second
#define debug(x) cerr<<#x<<" = "<<x<<'\n';
const LL mod=1e9+7;
const int maxn=3e5+9;
const int inf=0x3f3f3f3f;
LL rd(){ LL ans=0; char last=' ',ch=getchar();
    while(!(ch>='0' && ch<='9'))last=ch,ch=getchar();
    while(ch>='0' && ch<='9')ans=ans*10+ch-'0',ch=getchar();
    if(last=='-')ans=-ans; return ans;
}
/*_________________________________________________________begin*/

char x[maxn];

int main(){
    int t=rd();
    while(t--){
        int a=rd(),b=rd();
        int cant=0;
        gets(x+1);
        int len=strlen(x+1);
        int tmp=0;
        int num=-1;
        int ct=0;
        rep(i,1,len+1){
            if(x[i]=='X'||x[i]=='\0'){
                if(tmp<b);
                else if(tmp>=b&&tmp<a){
                    cant=1;break;
                }
                else if(tmp>=2*b){
                    if(num==-1)num=tmp;
                    else {cant=1;break;}
                }
                else{
                    ct++;
                }

                tmp=0;
            }
            else tmp++;
        }
        if(cant){printf("NO\n");continue;}
        if(num!=-1){
            int can=0;
            rep(i,0,num-a){
                int j=num-a-i;
                if(i>=2*b||j>=2*b)continue;
                if(i>=b&&i<a)continue;
                if(j>=b&&j<a)continue;
                int now=ct;
                if(i>=b)now++;
                if(j>=b)now++;

                if(now%2==0)can=1;
            }
            if(can)printf("YES\n");
            else printf("NO\n");
        }
        else{
            if(ct%2)printf("YES\n");
            else printf("NO\n");
        }
    }
    return 0;
}

转载:https://blog.csdn.net/jk_chen_acmer/article/details/101223595
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场