1 条题解

  • 0
    @ 2025-8-24 22:46:15

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Nuyoah_awa
    事实证明,你没让我失望。

    搬运于2025-08-24 22:46:15,当前版本为作者最后更新于2023-04-05 18:04:10,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题目大意

    给定一个 n×mn \times m 的矩阵,每个点有三个值,每次操作可将一个点的一个值改变,在每次操作过后,请你输出图片是否左右对称?

    题目分析

    我们可以按照题目要求每次更改一个数,再看是否对称。

    时间复杂度 O(q×n×m)\mathcal O(q \times n \times m)

    我们发现,每回只改一个值,所以我们可以记一个 cntcnt 表示矩阵共有 cntcnt 对点左右不对称,每次更改一个数后有如下四种情况:

    1. 原来这个点对称,后来这个点依旧对称(改了跟没改一样):cntcnt 不变。
    2. 原来这个点对称,后来这个点不对称(改不对称了):cnt+1cnt + 1
    3. 原来这个点不对称,后来这个点依不旧对称(好像改了,但是没完全改):cntcnt 不变。
    4. 原来这个点不对称,后来这个点对称(改对称了):cnt1cnt-1

    每次改完后,如果 cnt=0cnt = 0 即没有点不对称,输出 Yes

    否则说明有点不对称,输出 No

    code

    #include <iostream>
    #include <cstdio>
    
    using namespace std;
    
    const int N = 105, MOD = 256;
    struct node{
    	int a[4];
    }p[N][N];
    int n, m, q, x, y, t, c, cnt;
    
    bool operator == (node u, node v)
    {
    	for(int i = 1;i <= 3;i++)
    		if(u.a[i] != v.a[i])
    			return false;
    	return true;
    }
    
    int main()
    {
    	scanf("%d %d %d", &n, &m, &q);
    	for(int i = 1;i <= q;i++)
    	{
    		scanf("%d %d %d %d", &x, &y, &t, &c);
    		if(p[x][y].a[t] == p[x][m - y + 1].a[t])
    		{
    			(p[x][y].a[t] += c) %= MOD;
    			cnt += (p[x][y].a[t] == p[x][m - y + 1].a[t]) ? 0 : 1;
    		}
    		else
    		{
    			(p[x][y].a[t] += c) %= MOD;
    			cnt += (p[x][y].a[t] == p[x][m - y + 1].a[t]) ? -1 : 0;
    		}
    		(cnt == 0) ? printf("Yes\n") : printf("No\n");
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    8255
    时间
    1000ms
    内存
    128MiB
    难度
    1
    标签
    递交数
    0
    已通过
    0
    上传者