当前位置: 首页 > news >正文

【补题】Xi‘an Invitational 2023 E. Merge the Rectangles

题意:给个矩形,然后在里面画很多条线,将矩阵分割,保证分割出来的图案一定是矩形,至于n,m矩阵这里不多赘述,题意就是这样,如果不记得了请转至原题
原题链接:Merge the Rectangles - Problem - QOJ.ac
 

思路:

1.首先得知分割出来的图案是矩形,这一点很重要,这其实影响后面结论的得出

2.到底是什么样的矩形才能合并,为什么第二个样例只要长成那样没有任何机会合并?不妨反着思考,一个能合并的矩形是怎么创造出来的。
其实光看样例会有点感觉,再玩玩更有感觉了,No的样例似乎好像缺了一条完整的穿越列或者行的线,当然这是我vp时个人思路不影响整个题解

如果我们造出来的矩形一定能合并是什么样子的?没错,就是把在分割出来的矩形,再画一条笔直贯穿的线,有并且一定是笔直的,因为弯曲的线会导致分割出来的图形不是矩形,所以这道题任何一条分割线都是直线,这给了我们dfs去快速询问每一条边的机会。
为什么用dfs?因为如果当前分割出来的矩形是可合并的,这代表着有那么一条线出现在矩形中并且会贯穿这一整个矩形,那么其实我们要求矩阵中的任何一条线是否是由边界或者上一条分割线而来的。

图中可以合并我是怎么画出来的

综上代码的写法就很明确了,因为有01值,利用前缀和判断这条线是否成功贯穿了当前矩形,如果没贯穿但是有线的存在,得记录下来这里可能是导致无法合并的原因(无法合并就是凭空在当前矩形里挖了一块,看一下样例就知道了,是凭空捏出来的,凑出来的矩形)

如果贯穿了,那么根据这条线所新分割出来的矩形,仿照上面递归去询问其他的线是正确划分矩形的方式吗

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
const int N = 1e6+10;
const int INF = 1e12;
const int MOD = 998244353;

int y[1505][1505];//横着
int x[1505][1505];//竖着

int dfs(int x1,int y1,int x2,int y2){
	int sum=0;
	
	for(int i=x1+1;i<x2;i++){
		if( y[i][y2-1]-y[i][y1-1]==y2-y1 ){
			return dfs(x1,y1,i,y2) && dfs(i,y1,x2,y2);
		}
		sum+=y[i][y2-1]-y[i][y1-1];
	}
	
	for(int i=y1+1;i<y2;i++){
		if( x[x2-1][i]-x[x1-1][i]==x2-x1 ){
			return dfs(x1,y1,x2,i) && dfs(x1,i,x2,y2);
		}
		sum+=x[x2-1][i]-x[x1-1][i];
	}
	
	if(!sum) return 1;
	return 0;
	
}

void solve(){
	int n,m;
	cin >> n >> m;
	
	for(int i=2;i<=n;i++){
		for(int j=1;j<=m;j++){
			char c;
			cin >> c;
			y[i][j]+=(c-'0');
			y[i][j]+=y[i][j-1];
		}
	}
	
	for(int i=1;i<=n;i++){
		for(int j=2;j<=m;j++){
			char c;
			cin >> c;
			x[i][j]+=(c-'0');
			x[i][j]+=x[i-1][j];
		}
	}
	
	if(dfs(1,1,n+1,m+1)) cout << "YES" << endl;
	else cout << "NO" << endl;
	
}

signed main() {
	IOS;
	
	int t = 1;
//	cin >> t;
	while (t--) {
		solve();
	}
	
}

个人感觉这道又是逆向思维的体现,其实只要倒过来想,就会发现矩阵是否能成功合并很简单

参考了qoj一个人的题解:Submission #196363 - QOJ.ac
十分感谢

http://www.dtcms.com/a/110048.html

相关文章:

  • 【PHP】- 字符串,数组,字典常用操作
  • Cribl 脱敏mask
  • (三)机器学习---线性回归及其Python实现
  • 聚焦建筑业碳中和,楼宇自控系统应如何发挥建筑节能价值
  • 大语言模型中的嵌入模型
  • (C语言)单链表(2.0)数据结构(指针,单链表教程)
  • 栈和队列的概念
  • dfs递归回溯的两种体型
  • 水下声呐探测仪,应急救援中的高效水下定位技术|深圳鼎跃
  • Nuxt3项目的SEO优化(robots.txt,页面tdk,伪静态.html,sitemap.xml动态生成等)
  • 开源虚拟化管理平台Proxmox VE部署超融合
  • RHCSA LINUX系统文件管理
  • 市场交易策略优化与波动管理
  • 6.模型训练4-毕设篇
  • 【Prometheus】kube-state-metrics 的详细说明
  • 【学习笔记】计算机网络(七)—— 网络安全
  • Metasploit 反弹Shell
  • eplan许可证常见问题及解决方法
  • 数据结构(JAVA)单向,双向链表
  • 解析CSRF攻击
  • Transformer架构详解:从Encoder到Decoder的完整旅程
  • VSCode历史版本的下载安装
  • 破解AI编程瓶颈:上下文管理助力高效开发,以Cline为例
  • kornia,一个实用的 Python 库!
  • 环形链表相关题目
  • ARM架构安装MySQL8.0
  • 数据结构每日一题day11(链表)★★★★★
  • Python HTTP交互双剑客:requests与responses实战指南
  • 2025年消防设施操作员考试题库及答案
  • 矩池云使用指南