Codeforces 1292A/1293C - NEKO's Maze Game

题目大意:

有一个2*n的图

NEKO#ΦωΦ要带领mimi们从(1,1)的点走到(2,n)的点

每次会操作一个点,从可以通过到不可以通过,不可以通过到可以通过

每操作一次要回答一次NEKO#ΦωΦ能不能带领他们走到那里

 

解题思路:

用cnt记录不能走的种类数
两个数组,分别对应r为1和r为2
值用0和1表示能通过和不能通过
如果当前操作的是点c
如果操作完之后这个点的值变成了0(可以通过了)
那么就考虑另外一个r的数组的 c-1 c c+1 三个点的情况
如果三个点满足题意(大于等于1且小于等于n)并且点值为1(不能通过),说明这个点能和这次操作被消除的点构成一个障碍
而此时这个点变成了0,说明障碍消除了,所以不能走的种类数可以-1
总而言之,c-1 c c+1 这三个点有多少个1,拿cnt就减几
如果操作完变成了1(不能通过了)
照常,看另外一个r数组的 c-1 c c+1 这三个点有多少个1,拿cnt就加几(不能走的种类数会增加)
最后看cnt的状态
如果cnt为0则表示能走
否则不能走

#include<bits/stdc++.h>
using namespace std;
int a[100050],b[100050];
void solve(){
    int n,q,i,x,y,cnt=0;
    memset(a,0,sizeof a);
    memset(b,0,sizeof b);
    cin>>n>>q;
    while(q--){
        cin>>x>>y;
        if(x==1){
            a[y]=1-a[y];
            if(a[y]){
                if(y-1>0)
                    cnt+=b[y-1];
                cnt+=b[y];
                if(y+1<=n)
                    cnt+=b[y+1];
            }
            else{
                if(y-1>0)
                    cnt-=b[y-1];
                cnt-=b[y];
                if(y+1<=n)
                    cnt-=b[y+1];
            }
        }
        else{
            b[y]=1-b[y];
            if(b[y]){
                if(y-1>0)
                    cnt+=a[y-1];
                cnt+=a[y];
                if(y+1<=n)
                    cnt+=a[y+1];
            }
            else{
                if(y-1>0)
                    cnt-=a[y-1];
                cnt-=a[y];
                if(y+1<=n)
                    cnt-=a[y+1];
            }
        }
        cout<<(cnt==0?"Yes":"No")<<endl;
    }
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    solve();
    
    return 0;
}

 

posted @ 2020-01-20 00:47  StelaYuri  阅读(238)  评论(0编辑  收藏  举报