码迷,mamicode.com
首页 > 其他好文 > 详细

题解 CF1292A 【NEKO's Maze Game】

时间:2020-01-20 09:40:13      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:display   cst   alt   code   lin   解释   bre   using   题解   

有一个结论:

\((1,1)\) 不能抵达 \((2,n)\) 时,必定存在一个点对,这两个点的值均为真,且坐标中的 \(x\) 互异,\(y\) 的差 \(\leq 1\)

这个结论的正确性感觉非常显然,就不多说了。

下图可以形象地解释点对的位置关系。

技术图片

那对于每个点的值,只要开一个数组 f[i][j] 记录一下即可。


有了上述结论,我们记一个变量 \(cnt\) 表示 " 有多少对满足上述结论的点对 " ,则 \(cnt=0\) 时,\((1,1)\) 可以抵达 \((2,n)\) ,反之不可抵达。重点在于如何维护 \(cnt\)

对于每次反转的点 \((x,y)\) ,我们都需要往 \(cnt\) 里 扣除 \(/\) 补上 \((x,y)\) 的贡献,具体的:(为了方便异或 \(x\)\(0\)\(1\)

\(f[x][y]=1\) ,令 \(cnt-=f[x \ xor \ 1][y-1]+f[x \ xor \ 1][y]+f[x \ xor \ 1][y+1]\)\(f[x][y]=0\)

\(f[x][y]=0\) ,令 \(cnt+=f[x \ xor \ 1][y-1]+f[x \ xor \ 1][y]+f[x \ xor \ 1][y+1]\)\(f[x][y]=1\)

这样就可以起到维护 \(cnt\) 的效果了,时间复杂度 \(O(n)\)


Code 部分

#include<cstdio>

#define RI rgeister int

using namespace std;

inline int read()
{
    int x=0,f=1;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-f;s=getchar();}
    while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
    return x*f;
}

const int N=100100;

int n,q;

int f[2][N];

int cnt;

int main()
{
    n=read(),q=read();

    while(q--)
    {
        int x=read()-1,y=read();
        switch(f[x][y])
        {
            case 1:{
                cnt-=f[x^1][y-1]+f[x^1][y]+f[x^1][y+1];
                f[x][y]=0;
                break;
            }

            case 0:{
                cnt+=f[x^1][y-1]+f[x^1][y]+f[x^1][y+1];
                f[x][y]=1;
                break;
            }
        }

        puts(!cnt?"Yes":"No");
    }

    return 0; 
}

\[ thanks \ for \ watching \]

题解 CF1292A 【NEKO's Maze Game】

标签:display   cst   alt   code   lin   解释   bre   using   题解   

原文地址:https://www.cnblogs.com/cjtcalc/p/12216571.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!