Codeforces Round #614 (Div. 2) C. NEKO's Maze Game

题目链接:http://codeforces.com/contest/1293/problem/C

题意:给定n,q,即给定一个2*n的格子,有q个查询。

每个查询给定一个ri和ci,ri为1或2,ci在1到n之间,即给定一个(ri,ci),该点自该查询起状态进行转变(可经过/不可经过)。

如某个查询给定1,2,即点(1,2)无法经过,若之后查询再次给定1,2,则该点(1,2)可以经过。

问能否从(1,1)走到(2,n),保证给定的查询不会经过起点和终点。

 

思路:

由于n和q最大都是1e5,所以不能直接n*q暴力。

由于有三千个人做出来,所以是水题:)

不要想太多:)

线段树应该可以做

枚举每个无法经过的点应该也可以做,就是麻烦

 

因为一个点只会对附近最多三个点产生影响

所以可以直接O(q),加点时加上对应的贡献,在删点时把它删掉即可。

#include
using namespace std;
const int maxn=1e5+10;
int c[2][maxn];
int main()
{
    int n,q,num=0;
    scanf("%d%d",&n,&q);
    for(int i=0;i)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        x--;
        if(c[x][y])
        {
            c[x][y]=0;
            if(c[x^1][y])num--;
            if(c[x^1][y+1])num--;
            if(c[x^1][y-1])num--;
        }
        else 
        {
            c[x][y]=1;
            if(c[x^1][y])num++;
            if(c[x^1][y+1])num++;
            if(c[x^1][y-1])num++;
        }
        if(num==0)printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}

你可能感兴趣的:(Codeforces Round #614 (Div. 2) C. NEKO's Maze Game)