首页 > 其他分享 >6980. 【2021.02.03冬令营模拟】你的世界(world) Another Solution

6980. 【2021.02.03冬令营模拟】你的世界(world) Another Solution

时间:2024-03-14 21:44:21浏览次数:34  
标签:2021.02 03 冬令营 元素 矩阵 bmatrix oplus textcolor red

Problem Description

Input

从文件 world.in 中读入数据。

Output

输出到文件 world.out 中。

输出共 T 行,第 i 行表示第 i 组测试数据的答案,如果可行则输出 Yes,否则输出 No。

Sample Input Copy

样例输入1:
1
2 3
000
000
111
001

样例输入2:
1
3 4
0000
0101
0001
1011
0001
1100

样例输入3:
1
4 5
11000
01010
00011
10110
00011
11001
11010
10001

Sample Output Copy

样例输出1:
Yes

样例输出2:
Yes

样例输出3:
No

Data Constraint

首先,\(A\gets A\oplus B\),我们的问题就变成了怎么操作使得一个空矩阵变成新的矩阵 \(A\)。


先考虑只能操作行和列,该怎么做。

如果这张图是合法的,我们发现对于任意的 \(2\times2\) 子矩阵 \(\begin{bmatrix} a_{0,0} & a_{0,1} \\ a_{1,0} & a_{1,1} \end{bmatrix}\),有 \(a_{0,0}\oplus a_{0,1}\oplus a_{1,0}\oplus a_{1,1}=0\)。

我们来证明一下,因为对于操作行和列,一定会操作 \(2\times2\) 子矩阵中的任意两个,那么异或结果不变。

所以,我们定义 \(a_{0,0},a_{0,1},a_{1,0},a_{1,1}\) 这类异或结果不变的为固定元素,其余的为不固定元素。

\(2\times2\) 子矩阵中有固定元素,也就是这个子矩阵被固定了,所以它合法。


存不存在更小的子矩阵呢?比如说 \(1\times1\) 子矩阵。

答案是不存在的,因为对于一个 \(1\times1\) 子矩阵 \(\begin{bmatrix} a_{0,0} \end{bmatrix}\),我们可以随意修改这个点,所以不存在固定元素,不合法。


考虑加入对角线操作。

如果还是刚刚的 \(2\times2\) 矩阵,我们发现由于对角线操作的加入可以出现形如 \(\begin{bmatrix} 0 & 1 \\ 1 & 1 \end{bmatrix}\),\(\begin{bmatrix} 0 & 0 \\ 0 & 1 \end{bmatrix}\) 等等等等的矩阵,子矩阵中没有一个元素是固定元素,这个子矩阵是不固定的!

所以考虑更大的子矩阵。


考虑一个 \(4\times4\) 子矩阵,我们发现对于任意的 \(4\times4\) 子矩阵 \(\begin{bmatrix} a_{0,0} & \textcolor{red}{a_{0,1}} & \textcolor{red}{a_{0,2}} & a_{0,3} \\ \textcolor{red}{a_{1,0}} & a_{1,1} & a_{1,2} & \textcolor{red}{a_{1,3}} \\ \textcolor{red}{a_{2,0}} & a_{2,1} & a_{2,2} & \textcolor{red}{a_{2,3}} \\ a_{3,0} & \textcolor{red}{a_{3,1}} & \textcolor{red}{a_{3,2}} & a_{3,3} \\ \end{bmatrix}\),有 \(a_{0,1}\oplus a_{0,2}\oplus a_{1,0}\oplus a_{1,3}\oplus a_{2,0}\oplus a_{2,3}\oplus a_{3,1}\oplus a_{3,2}=0\)。(为了方便我将这些固定元素标红)

证明显然:

  • 对于 \(a_{0,0},a_{0,3},a_{3,0},a_{3,3}\),可以进行一个对角线操作,所以这些元素是可以随便调整的,是不固定元素;
  • 对于 \(a_{0,1},a_{0,2},a_{1,0},a_{1,3},a_{2,0},a_{2,3},a_{3,1},a_{3,2}\),这些元素无法抵消,只能进行对角线同时操作两个固定元素,所以异或结果不会变化;
  • 对于 \(a_{1,1},a_{1,2},a_{2,2},a_{2,2}\),这些元素可以通过乱搞抵消,具体自己乱搞。

所以这个子矩阵是固定的。

我们继续发现,不存在比 \(4\times4\) 还小的子矩阵。


所以这道题就很简单了,枚举矩阵 \(A\) 的子矩阵左上角 \((i,j)\),只需要所有的子矩阵均满足满足 \(a_{i,j+1}\oplus a_{i,j+2}\oplus a_{i+1,j}\oplus a_{i+1,j+3}\oplus a_{i+2,j}\oplus a_{i+2,j+3}\oplus a_{i+3,1}\oplus a_{j+3,2}=0\),则这张图有解。

时间复杂度 \(O(nm)\)。


然后这道题就可以开始加强了,比如加入各种新印章,都可以用这种方法轻松解决。

#include <cstdio>
#include <chrono>
#include <random>
using namespace std;
using namespace chrono;
#define ll long long
#define N 1010
ll t, n, m;
char a[N][N], b[N][N];
int main() {
	freopen("world.in", "r", stdin);
	freopen("world.out", "w", stdout);
	scanf("%lld", &t);
	while(t--) {
		scanf("%lld %lld", &n, &m);
		for(ll i = 1; i <= n; i++) {
			scanf("%s", a[i]+1);
		}
		for(ll i = 1; i <= n; i++) {
			scanf("%s", b[i]+1);
			for(ll j = 1; j <= m; j++) {
				if(a[i][j] == b[i][j]) a[i][j] = 0;
				else a[i][j] = 1;
			}
		}
		bool flag = 1;
		for(ll i = 1; i <= n - 3; i++) {
			for(ll j = 1; j <= m - 3; j++) {
				if(a[i][j+1] ^ a[i][j+2] ^ a[i+1][j] ^ a[i+1][j+3] ^ a[i+2][j] ^ a[i+2][j+3] ^ a[i+3][j+1] ^ a[i+3][j+2]) {
					printf("No\n");
					flag = 0;
					break;
				}
			}
			if(!flag) break;
		}
		if(flag) printf("Yes\n");
	}
}

标签:2021.02,03,冬令营,元素,矩阵,bmatrix,oplus,textcolor,red
From: https://www.cnblogs.com/znpdco/p/18074075

相关文章

  • 20240314打卡
    第三周第一天第二天第三天第四天第五天第六天第七天所花时间3h5h0h1h代码量(行)274256064博客量(篇)1111知识点了解完成AndroidStudio中原生数据库SQlite简单的CRUD本地数据库连接到远程数据库海底谭练习python的Pyautogui,自动操作G......
  • Doremy's Drying Plan (Hard Version)
    我们先来看看简单版本的想法,非常具有启发性大致的思路见这篇文章下面是对这篇文章具体操作的阐释我们先将所有区间按照左端点单调递增排序,并统计每一个区间中\(c_i=1\)的个数(这个直接用前缀和就好了,设\(sum[i][j]\)表示前\(i\)个数中\(c_k=j\)的个数),枚举其中一个区间(设为\([l,r......
  • lc2035 将数组分成两个数组并最小化数组和的差
    给你一个长度为2n的整数数组,需要将它分成两个长度为n的数组,分别求出两个数组的和,并最小化两个数组和之差的绝对值。nums中每个元素都需要放入两个数组之一,求最小的数组和之差。1<=n<=15;-1E7<=nums[i]<=1E7直接暴搜的话最坏时间复杂度是O(2^30),会TLE,可以使用双向dfs优化,每次df......
  • Doremy's Connecting Plan
    这道题目。。哎首先,我们对两个连通块进行连边的时候,肯定是选择编号最小的点进行连边,所以下文的\(i,j\)都指代编号最小的\(i,j\)然后我们就没有其他思路了。。但其实样例一的解释给了我们一种猜想:最终的图一定可以长成以\(1\)号点为中心的菊花图要达到这一点,我们肯定是尝试构造......
  • 2024-03-14
    2024-03-14Riddle继续做上次没做出来的题2-SAT限制是如果一个点不选,那么与它相连的所有点都必须选如果一个点选了,那么和他在同一个部分的所有点都不能选对于边的限制直接建但是“部分”的限制直接建图是\(O(n^2)\)的优化方法是前缀优化建图对于每一个部分,用\(a_i......
  • docker_03days
    迁移备份#镜像从哪来的?1dockerpull拉的2通过容器打包成镜像-centos镜像运行成容器---》装了vim-把装了vim的容器---》打包成镜像-以后拿到这个镜像--》再运行成容器,都会带vim命令3Dockerfile构建#容器保存为......
  • 百度网盘(百度云)SVIP超级会员共享账号每日更新(2024.03.14)
    一、百度网盘SVIP超级会员共享账号可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答。我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免了U盘的物理载体,直接在网上就实现文件传输。百度网盘SVIP会员可以让自己百度账......
  • KubeSphere 社区双周报|2024.02.29-03.14
    KubeSphere社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过commit的贡献者,并对近期重要的PR进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。本次双周报涵盖时间为:2024.02.29-03.14。贡献者名单新晋KubeSpherecontribu......
  • 2024-03 STEMA 考试C++ 中级真题解析
    2024-03-10STEMA考试C++中级真题解析一、选择题(50分)1、    (110010)2+(c3)16的结果是(B )。A.(240)10        B.(11110101)2        C.(366)8        D.(f6)16备注:此题目下标代表进制,因不支持md格式。  2、   表达式1000/3的结果是(......
  • L2-003 月饼
    背包。#include<bits/stdc++.h>usingnamespacestd;structnode{ doublekc,sj; doubleavg;}s[1010];boolcmp(noden1,noden2){ returnn1.avg>n2.avg;}intmain(){ intn,total; cin>>n>>total; for(inti=0;i<n;i++){ cin>>......