首页 > 编程语言 >蓝桥-13届-C++-B组-省赛-F题-统计子矩阵

蓝桥-13届-C++-B组-省赛-F题-统计子矩阵

时间:2022-12-24 16:33:26浏览次数:68  
标签:13 temp int 矩阵 prefixSum C++ col1 蓝桥 long

直达链接

主要解题思路分为两个部分,1是构造二维前缀和计算矩阵和,降低每次求和的时间复杂度;2是对所有子矩阵的遍历求和过程,因为需要两个坐标,遍历4个行/列值,4层for循环时间复杂度太高,所以最后两层,在同一个数组中就采用了尺取法(滑动窗口),降低了一层时间复杂度

#include<iostream>
#include<vector>
using namespace std;

int main() {
	// 先准备一个二维前缀和
	int n, m, k;
	cin >> n >> m >> k;
	vector<vector<int>> prefixSum(n + 1, vector<int>(m + 1, 0));
	// 这里要用long long,不然最后三个测试用例int会溢出
	long long temp;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++) {
			cin >> temp;
			prefixSum[i][j] = prefixSum[i - 1][j] + prefixSum[i][j - 1] - prefixSum[i - 1][j - 1] + temp;
		}
	temp = 0;
	// 然后怎么检查每个可能的子矩阵?
	// 需要两组坐标,4个行/列值,表示一个唯一的子矩阵
	for (int row1 = 1; row1 <= n; row1++) {
		for (int row2 = row1; row2 <= n; row2++) {
			// 尺取法/滑动窗口/双指针,注意循环控制的是右边界,而左边界是我们手动控制的
			for (int col1 = 1, col2 = 1; col2 <= m; col2++) {
				// 当区间不满足条件(不大于k的时候)
				while (col2 >= col1 && 
					(prefixSum[row2][col2] - prefixSum[row2][col1 - 1] - prefixSum[row1 - 1][col2] + prefixSum[row1 - 1][col1 - 1]) > k)
					col1++;
				temp += col2 - col1 + 1;
			}
		}
	}
	cout << temp<<endl;
	return 0;
}

对前缀和不熟悉,可以先用力扣-303力扣-304热身

标签:13,temp,int,矩阵,prefixSum,C++,col1,蓝桥,long
From: https://www.cnblogs.com/yaocy/p/17003009.html

相关文章

  • C++基础3
    C++基础3typedef为现有类型创建一个新名字主要有以下几种形式:为基本数据类型定义别名为指针定义别名为自定义数据类型定义别名为数组定义别名声明函数定义新......
  • 51nod1355
    没啥意思的板子题。首先,众所周知,\[\gcd\{f_a,f_b\}=f_{\gcd\{a,b\}}\]所以考虑将\(\operatorname{lcm}\)转化为\(\gcd\)。\(\min-\max\)容斥指出,\[\max_{a\inS}a......
  • 1350年,法国学者证明的自然数倒数和为发散的原理
    ......
  • AcWing1134/洛谷P1144 最短路计数
    AcWing传送门洛谷传送门题目大意\(\qquad\)给一个无向图,边权都是\(1\),求出以\(1\)为源点,到各个点(\(1\simn\))的最短路数量解题思路\(\qquad\)边权都是\(1\)的图中最......
  • C/C++编译器配置——MinGW下载安装
    C/C++编译器配置——MinGW下载安装前言本文主要讲述如何安装C语言编译器——MinGW,特点是文章附有完整详细的实际安装过程截图,文字反而起说明提示作用。编写本文的原因......
  • 国产paozhu c++ web framework 正式版发布
    经过大半个月测试修改paozhuc++webframework正式版发布,1.0.5release官方第一次发布正式版,可以用于生产环境。易用性超越国外各种c++webframework,简单易用,新手......
  • [LeetCode]013-罗马数字转整数
    >>>传送门题目罗马数字包含以下七种字符:I,V,X,L,C,D和M。字符数值I1V5X10L50C1......
  • C++11:返回值类型后置(跟踪返回值类型)
    返回值类型后置语法,是为了解决函数返回值类型依赖于参数而导致难以确定返回值类型的问题。有了这种语法以后,对返回值类型的推导就可以用清晰的方式(直接通过参数做运算)描述......
  • C++进阶(哈希)
    vector容器补充(下面会用到)我们都知道vector容器不同于数组,能够进行动态扩容,其底层原理:所谓动态扩容,并不是在原空间之后接续新空间,因为无法保证原空间之后尚有可配置的空间......
  • C++——贪心
     5745:演讲大厅安排描述有一个演讲大厅需要我们管理,演讲者们事先定好了需要演讲的起始时间和中止时间。我们想让演讲大厅得到最大可能的使用。我们要接受一些预定而拒......