CF1162B Double Matrix

传送门:CF1162B Double Matrix

考虑贪心,我们只能交换 ai,ja_{i,j}bi,jb_{i,j},所以我们考虑将 ai,ja_{i,j}bi,jb_{i,j} 中小的数放入 ai,ja_{i,j},大的数放入 bi,jb_{i,j}。紧接着判断一次,如果两个矩阵都严格递增,输出 Possible,否则输出 Impossible。

那么有没有证明呢?

如果新的矩阵不满足递增顺序,那么无论如何排序,矩阵仍然无法递增。我们这样考虑:

假设新的矩阵 aa 中有一个 ai,ja_{i,j}ai,j1a_{i, j-1} 非递增顺序,那么我们尝试交换 ai,ja_{i,j}bi,jb_{i,j} 的值。我们以最好的方向考虑,假设 bi,j>ai,j1b_{i,j}>a_{i,j-1},那么我们要证明的就是 ai,jbi,j1a_{i,j} \le b_{i,j-1}

首先,在没有交换 ai,ja_{i,j}bi,jb_{i,j} 的值前,bi,jb_{i,j}bi,j1b_{i, j-1} 有两种可能的关系:

  1. 递增,即 bi,j>bi,j1b_{i,j}>b_{i,j-1},那么交换后需要满足 ai,j>bi,j1a_{i,j}>b_{i,j-1},如果 ai,j>bi,j1a_{i,j}>b_{i,j-1},那么显然因为 bi,j1>ai,j1b_{i,j-1}>a_{i,j-1} 可得 ai,jai,j1a_{i,j} \ge a_{i,j-1},与一开始的假设矛盾,故交换 ai,ja_{i,j}bi,jb_{i,j} 的值后矩阵不可能递增。

  2. 不递增,即 bi,jbi,j1b_{i,j} \le b_{i,j-1},那么又因为 ai,jbi,ja_{i,j} \le b_{i,j},显然 ai,jbi,j1a_{i,j} \le b_{i, j-1},故不行。

综上得证。

纵向的推导过程也是这样。

代码:

#include <cstdio>
#include <algorithm>
using namespace std;

const int N = 55;
int a[N][N], b[N][N], n, m;

int main()
{
	scanf("%d %d", &n, &m);
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++) scanf("%d", &a[i][j]);
	}
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
		{
			scanf("%d", &b[i][j]);
			if (b[i][j] < a[i][j]) swap(a[i][j], b[i][j]);
		}
	}
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
		{
			if (a[i][j] <= a[i][j - 1] || a[i][j] <= a[i - 1][j] || b[i][j] <= b[i][j - 1] || b[i][j] <= b[i - 1][j])
			{
				puts("Impossible");
				goto End;
			}
		}
	}
	puts("Possible");
	End:
	return 0;
}
posted @   HappyBobb  阅读(4)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示