题解 CF1292A 【NEKO's Maze Game】

有一个结论:

当 \((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】

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

时间: 2024-08-01 05:52:00

题解 CF1292A 【NEKO's Maze Game】的相关文章

Codeforces Round #614 (Div. 2) C. NEKO&#39;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,所以

CodeForces 1292A NEKO&#39;s Maze Game(思维)

1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <string> 5 #include <math.h> 6 #include <algorithm> 7 #include <vector> 8 #include <stack> 9 #include <queue> 10 #include <

NEKO&#39;s Maze Game-cf

题意:给你一个2×n的矩阵,起点在左上,终点在右下,可以移动到本格相邻的格子里,给你q个时间点,每个时间点会有一个格子的状态发生变化,格子状态分为可走和不可走,一开始所以格子都是可走的,要求输出每个时间点能不能从起点走到终点. 思路:对任意格子来说,设它的坐标为x,y,对于他的另一行的三个坐标3-x,y-1  ,3-x,y和3-x,y+1有一个是不可走的,整个道路就被塞死了,就无法从起点走到终点.也就是说整个矩阵任意一个点满足这种关系,整条路走不通,所以我们统计整个矩阵有多少组这种关系设为num

#614 C. NEKO&#39;s Maze Game

起初一直看不懂题的意思,最后看了大佬的视频讲解才明白了题的意思. 题意:每次询问重复的时候抵消上一次操作  如果是奇数次的操作则视为障碍阻挡前进 收获:0和1的转换技巧,简单搜索和巧定义全局变量,没必要一定要写出来函数 非函数写法: #include<bits/stdc++.h> using namespace std; const int N=1e5+5; int a[2][N]; int main() { int n,q;int obstacle=0; cin>>n>&g

CF1293C - NEKO&#39;s Maze Game 分块

一定是两个障碍物组成一对来破坏连通性,每个障碍物可能属于最多3对,然后维护障碍物对数就行.但是懒得讨论,暴力分块过了. 涉及到修改的块暴力重构这个块的连通性.只要左端两个位置和右端两个位置中任意两个可互达就具有连通性. 然后每次询问,就先看每个块的连通性,再看每个块之间是否成功的连接起来. 1 #include <cstdio> 2 #include <cmath> 3 using namespace std; 4 int n,q,m,M,acc[1100],mp[3][11000

CF 1912 A NEKO&#39;s Maze Game

题目传送门 题目描述 NEKO#ΦωΦ has just got a new maze game on her PC! The game's main puzzle is a maze, in the forms of a 2×n2×n rectangle grid. NEKO's task is to lead a Nekomimi girl from cell (1,1)(1,1) to the gate at (2,n)(2,n) and escape the maze. The girl

Codeforces Round #614

NEKO's Maze Game 题意 题解 代码 Aroma's Search 题意 题解 代码 Xenon's Attack on the Gangs 题意 题解 代码 NEKO's Maze Game 题目链接 https://codeforces.com/contest/1292/problem/A 题意 给出一个 2xN 的地图,每一时刻都有一个位置翻转状态(可走和不可走变换),输出每时刻是否可以从起点走到终点. 题解 地图只有 2xN,两个跨行相邻的位置不可走从起点就走不到终点. [

Codeforces Round #614 (Div. 2)

A. ConneR and the A.R.C. Markland-N 题目链接:https://codeforces.com/contest/1293/problem/A 题意: 有一个长为 n 的楼层,其中有 k 个楼层没有餐厅 ,你现在在 s 层,问你最少走多少个楼层可以到达餐厅吃饭 分析: 因为 k 只有 1000,所以直接往 s 层上下方找(当找到 0 或者 n + 1 时说明这个方向没有答案) #include<bits/stdc++.h> using namespace std;

hdu 6444 网络赛 Neko&#39;s loop(单调队列 + 裴蜀定理)题解

题意:有编号为0~n-1的n个游戏,每个活动都有一个价值(可为负),给你m,s和k,你可以从任意一个编号开始玩,但是下一个游戏必须是编号为(i + k)%n的游戏,你最多能玩m次游戏,问你如果最后你手里要有s的价值,那么你至少一开始要有多少价值. 思路:由裴蜀定理可以知道,如果有n个值首尾相连,间隔为k地走,那么最后会有一个循环节,这样的循环节一共有gcd(n, k)个,每个循环节长度n / gcd(n, k)个.所以我们只要找出所有循环节,并且把每个循环节的最大价值算出来就行了.对于每个循环节