P1169 [ZJOI2007] 棋盘制作

news2025/2/27 14:12:29

Portal.

悬线法。

悬线法,主要用来解决最大子矩形问题,由王知昆在 IOI2003 国家集训队论文中提出。

所谓“最大子矩形问题”,就是在一个给定的矩形网格中有一些障碍点,要找出网格内部不包含任何障碍点,且边界与坐标轴平行的最大矩形。

所谓悬线,就是对于一类线段,除了两个端点之外,不覆盖任何障碍点,我们称它为有效线段;上端点覆盖了一个障碍点或达到整个矩形上端的有效线段,就是悬线,相当于宽为 0 0 0 的矩形。

举个例子,下面这几条线,都是悬线:

所谓悬线法,就是先找出每一个点对应的悬线的长度,然后左右移动找到对应的最大宽度。

用一张图来看一下,会发现每一个极大矩形都可以由悬线扩展而来:

定义:

  • left ( i , j ) \text{left}(i,j) left(i,j) 表示底部为 ( i , j ) (i,j) (i,j) 的悬线能到达的最左位置。
  • right ( i , j ) \text{right}(i,j) right(i,j) 表示底部为 ( i , j ) (i,j) (i,j) 的悬线能到达的最右位置。
  • height ( i , j ) \text{height}(i,j) height(i,j) 表示从 ( i , j ) (i,j) (i,j) 能向上扩展的最大高度。

初始化:
height ( i , j ) = 1 left ( i , j ) = 0 right ( i , j ) = m \begin{aligned} &\text{height}(i,j)=1\\ &\text{left}(i,j)=0\\ &\text{right}(i,j)=m \end{aligned} height(i,j)=1left(i,j)=0right(i,j)=m
状态转移方程:
height ( i , j ) = height ( i − 1 , j ) + 1 left ( i , j ) = max ⁡ ( left ( i − 1 , j ) , left ( i , j ) ) right ( i , j ) = min ⁡ ( right ( i − 1 , j ) , right ( i , j ) ) \begin{aligned} &\text{height}(i,j)=\text{height}(i-1,j)+1\\ &\text{left}(i,j)=\max(\text{left}(i-1,j),\text{left}(i,j))\\ &\text{right}(i,j)=\min(\text{right}(i-1,j),\text{right}(i,j)) \end{aligned} height(i,j)=height(i1,j)+1left(i,j)=max(left(i1,j),left(i,j))right(i,j)=min(right(i1,j),right(i,j))
可以在 O ( 1 ) O(1) O(1) 的时间复杂度内完成对每条悬线的操作。

对于这道题来说,以长方形、正方形讨论即可。题目要求 01 01 01 交错,所以只需要相邻的点不相等即可。

代码如下:

#include <bits/stdc++.h>
using namespace std;

const int maxn=2005;
int gg[maxn][maxn],leftt[maxn][maxn]/*万能头里有left函数*/,rightt[maxn][maxn],height[maxn][maxn],N,M,ans1,ans2;

int main()
{
	cin>>N>>M;
	for(int i=1;i<=N;i++)
		for(int j=1;j<=M;j++)
		{
			cin>>gg[i][j];
			leftt[i][j]=rightt[i][j]=j;//建立悬线
			height[i][j]=1;//初始化,如果上下两个点相同也可以有一条长度为1的悬线
		}
	for(int i=1;i<=N;i++)
		for(int j=2;j<=M;j++)//注意从2开始
			if(gg[i][j]!=gg[i][j-1])
				leftt[i][j]=leftt[i][j-1];//预处理左边界
	for(int i=1;i<=N;i++)
		for(int j=M-1;j>0;j--)//注意从M-1开始
			if(gg[i][j]!=gg[i][j+1])
				rightt[i][j]=rightt[i][j+1];//预处理右边界,注意要从终边开始减
	for(int i=1;i<=N;i++)
		for(int j=1;j<=M;j++)
		{
			if(i>1&&gg[i][j]!=gg[i-1][j])
			{
				leftt[i][j]=max(leftt[i][j],leftt[i-1][j]);
				rightt[i][j]=min(rightt[i][j],rightt[i-1][j]);
				height[i][j]=height[i-1][j]+1;
			}
			int a=rightt[i][j]-leftt[i][j]+1/*横向长度*/,b=min(a,height[i][j]);
			ans1=max(ans1,b*b);ans2=max(ans2,a*height[i][j]);
		}
	cout<<ans1<<endl<<ans2;
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1158392.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大型企业如何通过低代码平台提高开发效率和降低成本?

云计算、大数据、人工智能、物联网风口之下&#xff0c;企业数字化转型如同被按下了快进键。为快速攻破转型路上的技术关&#xff0c;企业纷纷把目光投向了低代码开发平台&#xff0c;希望可以用最短的时间&#xff0c;开发出最适合企业发展的应用。 集团企业需要什么样的数字化…

高等数学啃书汇总重难点(十)重积分

方法性的一章&#xff0c;看着唬人&#xff0c;实际上定积分学得熟练&#xff0c;就可以很轻松的掌握这一章的内容&#xff0c;重点在于计算各种坐标下的二重或三重积分~ 1.几何意义 2.定义 3.性质 4.直角坐标计算二重积分 5.极坐标计算二重积分 6.三重积分 7.重积分的应用

Mac-Java开发环境安装(JDK和Maven)

JDK安装 1、访问oracle官网&#xff0c;下载jdk 点击下载链接&#xff1a;https://www.oracle.com/java/technologies/downloads/#java11-mac 选择Mac版本&#xff0c;下载dmg 打勾点击下载&#xff0c;跳转登陆&#xff0c;没有就注册&#xff0c;输入账号密码即可下载成功…

面试高频题:你如何知道HashMap正在进行扩容操作?

亲爱的小伙伴们&#xff0c;大家好&#xff01;我是小米&#xff0c;一个热爱技术分享的小编。今天&#xff0c;我们将一起来探讨一个程序员们在日常工作中常常遇到的问题——如何知道HashMap正在扩容。 HashMap&#xff0c;作为Java中最常用的数据结构之一&#xff0c;经常在…

“眶”护光明,爱尔眼科眼眶病专家团在方寸之间寻找光明密码

2023年8月&#xff0c;右眼罹患I型神经纤维瘤病的患儿孩子小豪(化名)在父亲熊勇的带领下&#xff0c;由爱尔眼科四川眼科医院孙丰源教授主刀&#xff0c;成功接受眼眶肿瘤切除术&#xff0c;保住了眼球和视力&#xff0c;这是生病10年来专家团队为其实施的第3次治疗。 据了解&a…

易知微智慧医疗:用科技守护健康

智慧医疗系统在国内处于一个快速发展的阶段&#xff0c;先进的医疗设备加上先进的计算机技术和网络科技&#xff0c;正在为医疗行业的转型升级提供支持。智慧医疗不仅可以提高医疗机构的效率和安全性&#xff0c;还可以让患者享受更高水平的服务和医疗体验。 目前&#xff0c;智…

功能测试用例,需要详细到什么程度?

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

C++类和对象中:运算符重载+const成员函数+日期类的完善

C类和对象中:运算符重载const成员函数日期类的完善 一.为什么C会有运算符重载这个语法呢?1.需求说明2.实现1.不规范的解决方案1.代码实现2.缺陷 3.具体的解决方案:运算符重载 二.运算符重载的语法形式1.语法形式2.private私有成员的解决方案1.封装出get函数,能够在类外读取对应…

小米6x 小米6x 一键刷twrp 安装面具magisk 实现root

为了在安卓上抓包chatgpt 只能root小米6x 来安装抓包工具小黄鸟 才能安装根证书来解析https。 工具面具卡包 1.一键刷TWRP 小米6X一键线recovery(需要先解bl锁)-20180506重发.zip - 蓝奏云 2. 在安装前清除数据 在开始刷机之前&#xff0c;需要先格式化 Data 分区和清除 Cac…

机械应用笔记

1. 螺纹转换头&#xff1a;又名金属塞头&#xff0c;例如M20-M16&#xff1b;适合于大小螺纹转换用&#xff1b; 2. 螺纹分英制和公制&#xff0c;攻丝同样也有英制和公制之分&#xff1b; 3. DB9头制作&#xff0c;M6.5的线&#xff0c;用M6.5的钻头扩线孔&#xff0c;在根…

onlyoffice 二次开发 连接器(connector) 表单填(Filling out the form) jsApi级别操作文档

阅读须知&#xff1a;本文针对有对word/excel进行js操作的需求 本次改造基于V7.3.3进行&#xff0c;已经更新进入docker。 小伙伴们须知&#xff1a;改造后的office docker需要付费&#xff08;875元&#xff09;&#xff0c;等于wps一个月费用 欢迎大家一起交流&#xff1a;V&…

Pandas教程(非常详细)(第一部分)

Pandas 库是一个免费、开源的第三方 Python 库&#xff0c;是 Python 数据分析必不可少的工具之一&#xff0c;它为 Python 数据分析提供了高性能&#xff0c;且易于使用的数据结构&#xff0c;即 Series 和 DataFrame。Pandas 自诞生后被应用于众多的领域&#xff0c;比如金融…

HarmonyOS鸿蒙原生应用开发设计- 元服务(原子化服务)图标

HarmonyOS设计文档中&#xff0c;为大家提供了独特的元服务图标&#xff0c;开发者可以根据需要直接引用。 开发者直接使用官方提供的元服务图标内容&#xff0c;既可以符合HarmonyOS原生应用的开发上架运营规范&#xff0c;又可以防止使用别人的元服务图标侵权意外情况等&…

echarts 实现分组和显示总数

echart 除了能显示坐标轴外&#xff0c;还可以对坐标轴进行分组&#xff0c;可以更直观的观察数 据&#xff0c;本博文记录一下关于分组的探索&#xff0c;先展示一下效果图&#xff1a; // 直接复制到echarts官方示例中查看效果 let xAxisData []; let data1 []; let data2 …

我的风信共享

登录界面&#xff1a; 管理员可以对所有文章包括管理员发布的文章进行管理&#xff1a; 普通用户只能对自己的文章进行操作; 分类展示&#xff1a; 文章发布功能&#xff1a; 搜索功能&#xff1a;

配电房/变电站可视化智能监控系统方案,助力打造“无人值守”监管模式

一、背景需求分析 配电房管理工作一直是供电系统运行管理可靠性的薄弱环节之一&#xff0c;一些配电房开关跳闸和配电房环境过热影响设备运行、配电房水浸导致设备损坏、配电房设备被盗等&#xff0c;既容易毁坏设备&#xff0c;也容易影响正常用电情况。传统监管方式是通过工…

Nacos 注册中心介绍与实操

前言 本文为个人SpringCloud学习笔记&#xff0c;主要记录Nacos的注册中心实操、SpringBoot多模块编程实操等 注册中心 注册中心介绍 注册中心是微服务的一个重要组件&#xff0c;用于实现服务的注册与发现&#xff0c;主要作用包括以下&#xff1a; 服务注册&#xff1a;…

【从零开始学习Linux】一文带你了解Shell外壳及用户权限(一)

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;Linux入门 &#x1f52d;【从零开始学习Linux】系列均属于Linux入门&#xff0c;主要包含Linux操作系统下的指令、操作、权限以及开发工具&a…

k8s之集群调度

目录 调度 工作机制 调度过程 调度算法 优先级 指定调度节点 调度 Kubernetes 是通过 List-Watch 的机制进行每个组件的协作&#xff0c;保持数据同步的&#xff0c;每个组件之间的设计实现了解耦。 用户是通过 kubectl 根据配置文件&#xff0c;向 APIServer 发送命令…

SandboxAQ推出量子安全“守卫军”!开源框架和加密算法元库Sandwich

Sandwich示意图&#xff08;图片来源&#xff1a;网络&#xff09; 未来几年&#xff0c;IT领域需要对当今计算机通信网络中使用的密码学协议进行一些重大更改&#xff0c;以确保它们仍然安全&#xff0c;且对未来的量子计算机具有应对能力。 其中一个关键特征称为加密敏捷性…