蓝桥杯真题讲解:子矩阵(二维滑动窗口)

蓝桥杯真题讲解:子矩阵(二维滑动窗口)

一、视频讲解

蓝桥杯真题讲解:子矩阵(二维滑动窗口)

二、正解代码

cpp 复制代码
//二维单调队列
#include<bits/stdc++.h>
#define endl '\n'
#define deb(x) cout << #x << " = " << x << '\n';
#define INF 0x3f3f3f3f
#define int long long
using namespace std;
const int mod =  998244353;
const int N = 1e3 + 10;
int g[N][N];
int q[N];
int line_max[N][N], line_min[N][N];
int maxv[N][N], minv[N][N];
int a, b, n, m;

void solve()
{
	cin >> n >> m >> a >> b;
	for(int i = 0; i < n; i ++)
		for(int j = 0; j < m; j ++)
			cin >> g[i][j];

	//求出每一行的滑动窗口
	for(int i = 0; i < n; i ++){
		int h = 0, t = -1;
		for(int j = 0; j < m; j ++){

			if(h <= t and q[h] < j - b + 1){
				h ++;
			}
			while(h <= t and g[i][q[t]] <= g[i][j])
				t--;

			q[++t] = j;
			if(j - b + 1 >= 0){
				line_max[i][j - b + 1] = g[i][q[h]];
			}
		}
	}
	
	//对每一行的滑动窗口求一遍滑动窗口
	for(int j = 0; j < m; j ++){
		int h = 0, t = -1;
		for(int i = 0; i < n; i ++){
			if(h <= t and q[h] < i - a + 1){
				h ++;
			}
			while(h <= t and line_max[q[t]][j] <= line_max[i][j])
				t --;
			
			q[++t] = i;
			if(i - a + 1 >= 0)
				maxv[i - a + 1][j] = line_max[q[h]][j];
		}
	}



	//求最小值
	//先针对每一行,求出每一行的滑动窗口。
	for(int i = 0; i < n; i ++){
		int h = 0, t = -1;
		for(int j = 0; j < m; j ++){
			if(h <= t and q[h] < j - b + 1){
				h ++;
			}
			while(h <= t and g[i][q[t]] >= g[i][j])
				t --;
			q[++ t] = j;
			if(j - b + 1 >= 0)
				line_min[i][j - b + 1] = g[i][q[h]]; 
		}
	}


	//针对每一列的滑动黑窗口,求滑动窗口。
	for(int j = 0; j < m; j ++){
		int h = 0, t = -1;
		for(int i = 0; i < n; i ++){
			if(h <= t and q[h] < i - a + 1){
				h ++;
			}
			while(h <= t and line_min[q[t]][j] >= line_min[i][j])
				t --;
			q[++ t] = i;
			if(i - a + 1 >= 0)
				minv[i - a + 1][j] = line_min[q[h]][j];
		}
	}

	int ans = 0;
	for(int i = 0; i < n; i ++){
		for(int j = 0; j < m; j ++){
			ans = (ans + maxv[i][j] * minv[i][j] % mod) % mod;
		}
	}
	cout << ans << endl;

}

signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int t;
	t = 1;
	//cin >> t;
	while(t--)
	solve();
}
相关推荐
007php0071 小时前
猿辅导Java面试真实经历与深度总结(二)
java·开发语言·python·计算机网络·面试·职场和发展·golang
woshihonghonga2 小时前
PyTorch矩阵乘法函数区别解析与矩阵高级索引说明——《动手学深度学习》3.6.3、3.6.4和3.6.5 (P79)
人工智能·pytorch·python·深度学习·jupyter·矩阵
缓风浪起2 小时前
【力扣】2011. 执行操作后的变量值
算法·leetcode·职场和发展
郝学胜-神的一滴2 小时前
矩阵的奇异值分解(SVD)及其在计算机图形学中的应用
程序人生·线性代数·算法·矩阵·图形渲染
电子_咸鱼7 小时前
LeetCode——Hot 100【电话号码的字母组合】
数据结构·算法·leetcode·链表·职场和发展·贪心算法·深度优先
微笑尅乐10 小时前
中点为根——力扣108.讲有序数组转换为二叉搜索树
算法·leetcode·职场和发展
夏鹏今天学习了吗11 小时前
【LeetCode热题100(46/100)】从前序与中序遍历序列构造二叉树
算法·leetcode·职场和发展
吃着火锅x唱着歌11 小时前
LeetCode 2389.和有限的最长子序列
算法·leetcode·职场和发展
007php00711 小时前
百度面试题解析:微服务架构、Dubbo、Redis及其一致性问题(一)
redis·百度·docker·微服务·容器·职场和发展·架构
被制作时长两年半的个人练习生15 小时前
近期的笔试和面试的复盘
算法·面试·职场和发展·算子