原题链接:蓝桥杯2023年第十四届省赛真题-子矩阵
先用滑动窗口求行的最大值,再对列求最大值,最后相乘求和取模即可
from collections import deque def maxWindows(num,size): #求滑动窗口最大值 n = len(num) if n == 0 or size == 0 or size > n : return [],[] maxqueue = deque() maxlist = [] for i in range(n): # 单调队列求最大值 while maxqueue and num[maxqueue[-1]] < num[i]: maxqueue.pop() maxqueue.append(i) if maxqueue[0] <= i - size : maxqueue.popleft() if i >= size - 1: maxlist.append(num[maxqueue[0]]) return maxlist def minWindows(num,size): #求滑动窗口最小值 n = len(num) if n == 0 or size == 0 or size > n : return [],[] minqueue = deque() minlist = [] for i in range(n): #单调队列求最小值 while minqueue and num[minqueue[-1]] > num[i]: minqueue.pop() minqueue.append(i) if minqueue[0] <= i - size : minqueue.popleft() if i >= size - 1: minlist.append(num[minqueue[0]]) return minlist def main(): n, m, a, b = map(int, input().split()) mod = 998244353 nums = [] for i in range(n): nums.append(list(map(int,input().split()))) maxhang = [] minhang = [] # 先按行求二维窗口最大值、最小值 for i in range(n): x = maxWindows(nums[i],b) y = minWindows(nums[i],b) maxhang.append(x) minhang.append(y) #print(maxhang) #print(minhang) trans_max = [[maxhang[j][i] for j in range(len(maxhang))] for i in range(len(maxhang[0]))] trans_min = [[minhang[j][i] for j in range(len(minhang))] for i in range(len(minhang[0]))] maxlie = [] minlie = [] # 按列求二维窗口最大值、最小值 for i in range(len(trans_max)): x = maxWindows(trans_max[i],a) y = minWindows(trans_min[i],a) maxlie.append(x) minlie.append(y) #print(maxlie) #print(minlie) ans = 0 for i in range(len(maxlie)): for j in range(len(maxlie[0])): ans += (maxlie[i][j] * minlie[i][j]) % mod ans %= mod print(ans) if __name__ == '__main__': main()
0.0分
7 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复