首页 > 其他分享 >洛谷题单指南-常见优化技巧-P1950 长方形

洛谷题单指南-常见优化技巧-P1950 长方形

时间:2024-08-30 09:51:16浏览次数:17  
标签:指南 小于 P1950 第一个 int 洛谷题 top 长方形 悬线

原题链接:https://www.luogu.com.cn/problem/P1950

题意解读:在一张n*m个格子的纸上,从没有画过的格子中剪出长方形的方案数。

解题思路:

1、暴力做法

枚举所有的子矩阵O(n^4),然后用二维前缀和计算子矩阵的和,通过和来判断子矩阵是否全部是'.'。

2、优化做法

针对每一行进行处理,计算包含每一行每一个格子的长方形数量。

考虑每一个'.'的格子的悬线(悬线的应用,可以参考:https://www.cnblogs.com/jcwy/p/18361265

设某一行每一列j的悬线高度h[j],每一列左边第一个小于等于h[j]的位置是l[j],右边第一个小于h[j]的位置是r[j]

如下图,

假设已处理到第3行,第3行每列点的悬线覆盖的是绿色区域,所以只用考虑绿色区域一共组成多少长方形。

如何计算绿色区域长方形的数量?

先考虑第1列:

h[1] = 1,l[1] = 0, r[1] = 3

解读:第一列悬线高度是1,左边第一个小于等于h[1]的位置是0,右边第一个小于h[1]的位置是4

所以:覆盖第一列的所有长方形数量为(1 - l[1]) * (r[1] - 1) * h[1] = 3,也就是第一列、第一二列、第一二三列三种情况。

再考虑第2列:

h[2] = 2, l[2] = 1, r[2] = 3

解读:第二列悬线高度是2,左边第一个小于等于h[2]的位置是1,右边第一个小于h[2]的位置是3

所以:覆盖第二列的所有长方形数量为(2 - l[2]) * (r[2] - 2) * h[2] = 2,也就是第二列、第二列+上一行的第二列两种情况。

再考虑第3列:

h[3] = 1, l[3] = 1, r[3] = 4

解读:第三列悬线高度是1,左边第一个小于等于h[3]的位置是1,右边第一个小于h[3]的位置是4

所以:覆盖第三列的所有长方形数量为(3 - l[3]) * (r[3] - 3) * h[3] = 2,也就是第三列、第三二列两种情况。

以上分析,就是包含第3行所有列的长方形的数量,不重不漏。

下面问题就在于如何计算l[],r[]

要计算j左边第一个小于等于h[j]的位置l[j],以及j右边第一个小于h[j]的位置r[j],可以借助单调栈。

100分代码:

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

const int N = 1005;
int n, m;
char a[N][N];
int h[N]; //h[j]表示某行第j列点的悬线高度
int l[N]; //l[j]表示某行第j列点左边第一个悬线高度小于等于h[j]的位置
int r[N]; //r[j]表示某行第j列点右边第一个悬线高度小于h[j]的位置
int stk[N], top;
long long ans;

int main()
{
    cin >> n >> m;
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
        {
            cin >> a[i][j];
            if(a[i][j] == '.') h[j] = h[j] + 1; //计算(i,j)的悬线高度
            else h[j] = 0;
        }

        //通过单调栈计算第i行每个点j左边第一个小于等于h[j]的位置,没有的话就是0
        top = 0;
        for(int j = 1; j <= m; j++)
        {
            while(top && h[stk[top]] > h[j]) top--;

            l[j] = stk[top];
            stk[++top] = j;
        }

        //通过单调栈计算第i行每个点j右边第一个小于h[j]的位置,没有的话就是m+1
        top = 0;
        for(int j = m; j >= 1; j--)
        {
            while(top && h[stk[top]] >= h[j]) top--;

            if(top) r[j] = stk[top];
            else r[j] = m + 1;
            stk[++top] = j;
        }

        //更新答案
        for(int j = 1; j <= m; j++)
            ans += (j - l[j]) * (r[j] - j) * h[j];
    }

    cout << ans;

    return 0;
}

 

标签:指南,小于,P1950,第一个,int,洛谷题,top,长方形,悬线
From: https://www.cnblogs.com/jcwy/p/18384290

相关文章

  • msvcr110.dll丢失的解决方法及全面指南
    MSVCR110.dll是MicrosoftVisualC++RedistributablePackage的一部分,对于运行许多基于Windows的应用程序至关重要。当系统报告此文件丢失时,可能导致各种程序无法正常启动。本文将详细介绍几种有效解决MSVCR110.dll丢失问题的方法,并分析各方法的优缺点,帮助用户快速恢复系统正......
  • 财务报表分析指南:如何掌握核心指标?
    一、概述财务报表中有大量信息,如果我们在分析时缺乏明确的方向或忽视了重点,就很容易在繁杂的数据中迷失方向。本文将深入探讨财务报表中的几个重要指标,帮助大家更有针对性地理解这些内容,包括如何分析资产负债率、解读净资产收益率,以及计算销售复合增长率。二、关键指标解读首......
  • vue history 模式打包部署在域名的二级目录的配置指南
    1.vue-router路由的文件的配置,根据自己部署的二级目录填写123exportdefaultnewVueRouter({ mode:"history",  base:"/web",2.在vue.config.js配置文件(如果没有新建一个,项目根目录下) 注意:baseUrl从VueCLI3.3起已弃用,请使用publicPath。......
  • Nginx负载均衡SSL证书配置全指南
    在当今的网络安全实践中,使用SSL证书对网站进行加密已成为标准配置。Nginx作为一个广泛使用的Web服务器和反向代理,提供了强大的SSL配置选项来保护数据传输的安全。本文将详细介绍如何在Nginx负载均衡中配置SSL证书,包括证书的获取、配置文件的编写、证书的更新和续期等。1.S......
  • 系统化提升FPGA设计技能:从基础到高级应用的全面指南
    引言FPGA(Field-ProgrammableGateArray,现场可编程门阵列)是现代数字电路设计和嵌入式系统开发中极其重要的工具。与传统的专用集成电路(ASIC)不同,FPGA允许设计人员在硬件层面进行灵活的编程,从而在各种应用中实现高性能和低延迟的解决方案。FPGA在数字信号处理、通信、视频处理、......
  • 如何提升单片机开发技能:从基础到进阶的全方位指南
    单片机(MicrocontrollerUnit,MCU)作为嵌入式系统的核心,广泛应用于家电控制、智能设备、工业自动化等领域。随着物联网(IoT)和智能设备的普及,单片机开发技能的提升变得愈发重要。本文将探讨如何从基础知识开始,逐步掌握单片机开发的核心技能,并向高级开发者进阶。目录1.夯实基础:......
  • 数业智能心大陆开学 “收心” 全指南
    凉爽的秋风为我们带来了新学期的讯息。欢乐的暑假已临近尾声,孩子即将重返校园,踏上全新的征程。开学在即,众多同学和家长“涌入”数业智能心大陆的AI心理咨询平台,与AI心理咨询师展开深入细致的交流。心大陆留意到,近期同学们普遍出现情绪波动的状况,例如精神萎靡、心情低落、......
  • 如何驱动企业数字化转型的敏捷企业的创新实践指南:敏捷企业架构的制胜之道
    敏捷企业架构如何引领企业转型变革在全球化与数字化交织的新时代,企业正处于前所未有的变革浪潮中。传统的企业架构方式已经难以应对瞬息万变的市场需求和技术革新。作为一种突破性解决方案,敏捷企业架构提供了一个灵活且强大的框架,帮助企业在动态环境中保持竞争优势,迅速响应市......
  • 小程序开发指南 —— webview 站点使用指南
    webview站点是随着小程序一同发布的静态文件站点,减轻开发者部署静态html文件负担,支持离线模式的技术。开发者可以在小程序中使用webview组件加载webview站点,实现小程序与webview站点的无缝衔接。webview站点的特性支持离线模式,提高访问速度支持与小程序逻辑层通信......
  • 并行处理的魔法:PyTorch中torch.multiprocessing的多进程训练指南
    并行处理的魔法:PyTorch中torch.multiprocessing的多进程训练指南在深度学习领域,模型训练往往需要大量的计算资源和时间。PyTorch,作为当前最流行的深度学习框架之一,提供了torch.multiprocessing模块,使得开发者能够利用多核CPU进行多进程训练,从而显著加速训练过程。本文将深......