Educational Codeforces Round 139 (Rated for Div. 2) C - Hamiltonian Wall

189 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第9天,点击查看活动详情

C - Hamiltonian Wall

题意:有两种颜色块W和B,要求B的颜色块全都染成黑色且是否存在一条路径满足路径上的块都相邻,所有的B块在路径中只出现一次以及W块不能在路径中出现,存在就输出yes,否则输出no 思路:搜索是一定不行的,虽然只有两行,但是每次都是两种选择,复杂度就是2的m次方,m=32都跑不过去,其实可以看出如果第一个点选定了,那么往后的路径就是固定的了,比如样例6
假如我们选择[1,1]这个点作为第一个点,那么顺序一定是[1,1],[2,1],[2,2],[2,3],[1,3],[1,4],[2,4],[2,5],[2,6],[1,6],这条路径是符合条件的
假如选择[1,2]这个点作为第一个点,那么顺序就是[1,2],[1,1],[1,2],然后就寄了,路径中含有了W块所以不满足条件
因为从头走到尾和从尾走到头是一样的,所以直接从[1,1]走一遍再从[1,2]走一遍,看看这两个点开始的路径是否满足条件就行,这个过程简单的模拟一下就可以,感觉这次的C题是很简单的,放到B题也不为过,实现的代码很简单,具体看代码吧

#include<bits/stdc++.h>
//#pragma-GCC-optimize("-Ofast");
#define ll long long
#define int long long
#define lowbit(x) ((x)&(-x))
#define endl '\n'
using namespace std;
const ll mod=998244353;
const ll inf=1e18;
const double pi=acos(-1);
const int N=1e6+100;
ll qpow(ll a,ll b)
{
    ll res=1;
    while(b)
    {
        if(b&1) res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}
ll getinv(ll a){return qpow(a,mod-2);}
int t,m;
char s[2][N];
bool check(int x)
{
    for(int i=2;i<=m;i++)
    {
        if(s[x][i]=='W') return 0;
        if(s[!x][i]=='B') x=!x;
    }
    return 1;
}
signed main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    cin>>t;
    while(t--)
    {
        cin>>m;
        cin>>(s[0]+1)>>(s[1]+1);
        int flag=0;
        if(s[0][1]=='B') flag=check(0);
        if(s[1][1]=='B') flag|=check(1);
        if(flag) cout<<"YES\n";
        else cout<<"NO\n";
    }
    return 0;
}