先用滑动窗口求行的最大值,再对列求最大值,最后相乘求和取模即可

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.0分

7 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 3 条评论

dotcpp0738541 10月前 回复TA
@dotcpp0738541 过了9个
dotcpp0738541 10月前 回复TA
Java暴力法:https://www.dotcpp.com/run/15533720
纤凝 11月前 回复TA
他这个写的和我在csdn上看到的几乎一样