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

蓝桥杯 C++ b组 统计子矩阵深度解析

题目大意:给定一个 N×M 的矩阵 A,请你统计有多少个子矩阵 (最小1×1,最大N×M) 满足子矩阵中所有数的和不超过给定的整数 K?

前言:这题很容易想到二维前缀和优化,然后枚举子矩阵,但这样时间复杂度为O(N^{4}),而题中N最大500,大概就是1.25*10^{8},但我们一般要把操作次数维护到10^{7}~10^{8}之间为最佳!但这样以及能过70%的数据了QWQ

解题思路:(双指针+一位前缀和)
我们整体的优化思路是:枚举子矩阵的上下边界,这是双层循环,然后在每个固定的边界里,用左右指针l,r来查找状态下满足的子矩阵个数,这么说可能比较抽象,下面用通俗一些的话来解释吧!

1.首先,我们定义了上边界i,下边界j,可以理解为一个我们在找子矩阵的时候,我们先把它的上下给定住!比如上边界为1,下边界为N,那这个情况下其实就是原矩阵(N×M)的上边界和下边界。

2.但是!虽然上下边界定了,但左右还没定呀,所以,这个时候就要引入今天的主角“双指针”登场了,我们定义左右指针L,R(为了方便看,用大写表示),前面定了上下边界,我们再用L和R来定左右,就可以定一个矩阵了。(大脑里面应该能想想出来,不行的话用笔画一下)

3.题中要求的是子矩阵所有数的和<=K,而一开始L=R=1,我们是要遍历R到右端点,并且再这个过程中计算这个围成的矩阵和是否已经超过了K,超过了,那么就要让L++,并且对于每一个移动的R,应该都是可以固定一个L是其矩阵刚好<=K,那么此时L与R围成的矩阵的恰好满足 ,再次强调:我们这里是先定的R,然后对于每一个R都能找到一段恰好<=K的区间,然后这个LR围成的区间中,我们找的子区间是以R为有边界(因为我们是遍历的R),此时若以L右边的元素为左边界,比如L+1,那么也肯定满足,比如L=0,中间有个1,R=2,那么对于[L,R]区间,我们此次计入的子区间就是012,12,2;

4.关于一些计算的,就是利用一维前缀和,并不难理解,结合代码直接看应该更易理解,就不在这里阐述了,把第三条看明白基本此题的思路已经很明确了

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

const int N = 505;

int n,m,k,a[N][N];
ll ans;

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    
    cin>>n>>m>>k;
    
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>a[i][j];
            a[i][j]+=a[i-1][j];//第j列的前缀和
        }
    }
    
    for(int i=1;i<=n;i++)//上边界
    {
        for(int j=i;j<=n;j++)//下边界
        {
            for(int l=1,r=1,sum=0;r<=m;r++)//右指针的移动
            {
                sum+=a[j][r]-a[i-1][r];//j表示下边界,i表示上边界,r就是当前的列
                while(sum>k)
                {
                    sum-=a[j][l]-a[i-1][l]; 
                    l++; 
                }
                ans+=r-l+1;
            }
        }
    }
    cout<<ans;
    return 0;
}

相关文章:

  • 【MySQL】(4) 表的操作
  • Java集合面试题
  • 文件上传漏洞(upload-labs)
  • 基于Django创建一个WEB后端框架(DjangoRestFramework+MySQL)流程
  • Kafka Connect HTTP 项目常见问题解决方案
  • 小白学Agent技术[4](Agent设计模式)
  • HTTPS实现内容加密的逻辑
  • kali虚拟机登录页面发癫 大写锁定输入不了密码
  • WPF基础知识41-60
  • Vue3实战学习(Vue3集成Element-Plus(常用依赖、插件安装与导入 。按钮、图标组件。自定义主题的实现)(超详细))(4)
  • 第10章:性能优化与应用发布
  • 大白话Vue Router 中路由守卫(全局守卫、路由独享守卫、组件内守卫)的种类及应用场景
  • C++之序列容器(vector,list,dueqe)
  • Locker 是 Godot 的一个开源插件,它提供了一种快速且可扩展的方式来使用不同的策略保存和加载数据,并且具有开箱即用的 JSON 和加密功能。
  • 【技海登峰】Kafka漫谈系列(六)Java客户端之消费者Consumer核心概念与客户端配置详解
  • 【单片机】ARM 处理器简介
  • Java EE 进阶:Spring IoCDI
  • 双击PPT文件界面灰色不可用,需要再次打开该PPT文件才能正常打开
  • 虚拟机vmware中ubuntu 磁盘扩容步骤
  • 六十天前端强化训练之第十三天之JavaScript 原型与继承详解
  • 上海市第二十届青少年科技节启动:为期半年,推出百余项活动
  • 北京韩美林艺术馆党支部书记郭莹病逝,终年40岁
  • 穆迪下调美国主权信用评级
  • 下周或迎外贸“抢出口”高峰,跨境电商敏感货物如何便利化“登机”?
  • 阳光保险拟设立私募证券投资基金,总规模200亿元
  • 六省会共建交通枢纽集群,中部六省离经济“第五极”有多远?