P8783 [蓝桥杯 2022 省 B] 统计子矩阵题解

· · 题解

P8783 [蓝桥杯 2022 省 B] 统计子矩阵题解

题目样例太水,纯暴力都能得80

咳咳,题目难度中规中矩,算是一道水题,不过做对还是有一定难度的。

OK,废话不多说,看题 [doge]

最终代码

题目概述

对于 n \times m 的矩阵 a,求有多少个子矩阵满足此子矩阵中所有数之和不大于 k

但是,我们来看看约定

1<N,M<500 0<a_ij<1000 **OK呀,题目大致就是这个意思,下面来看思路** ## 思路讲解 ### 首先,来讲一讲80分的代码 **可以很容易的想到:使用二维前缀和,在初始化矩阵数组做前缀和的预处理。** **然后再去判断子矩阵与 $k$ 的关系,统计答案输出即可。** **时间复杂度:$O(n^4)$** **OK,代码如下** [真·代码](http://www.luogu.org/) [空](https://www.luogu.com.cn/paste/bo4juutk) ### 100分做法 **我相信你们已经得了80分了,接下来,我来讲一讲100分做法** **很显然,只用二维前缀和是AC不了的,所以,我们可以使用双指针$two-pointer$。** [不会双指针点这里](https://oi.wiki/misc/two-pointer/) **我们可以用矩阵中遍历的所谓左上角的点行和列都小于右下角的点,在不满足条件的同时做遍历。** **我们可以定义4个指针,分别代表左上角和右下角,使它满足 $i <j 且 l<r$,遍历所有的情况,用$ans$计入个数** **好了,代码如[下](https://www.luogu.com.cn/paste/lvmtyh9e)。** [代码](https://www.bilibili.com/video/BV1uT4y1P7CX/?spm_id_from=autoNext&vd_source=b211052b1a22c3c38da2b7c470765c4d) ![美丽的冷老师](https://cdn.luogu.com.cn/upload/image_hosting/cpt7mv8z.png)