题意:
根据公式得到一个n×m的矩阵,求矩阵中大小为a×b的所有子矩阵中最小值之和。
(1 ≤ n,m ≤ 3000, 1 ≤ a ≤ n, 1 ≤ b ≤ m)
分析:
用单调队列维护区间最值,但是单调队列是相对于一维的,这里是二维区域,那么就可以分开处理两个维度,先依次处理行,再处理列。
例如 n=4,m=4,a=2,b=2,矩阵为:
1 3 5 7
8 6 4 2
1 2 3 4
9 8 7 6
先对每行利用单调队列进行处理,将b=2降为b=1;
以第一行为例,对于1 3,最小为1,则(1, 1) = 1,对于3 5,最小为3,则(1, 2) = 3,以此类推。
那么矩阵就变为如下形式
1 3 5
6 4 2
1 2 3
8 7 6
然后再对每列利用单调队列处理,得到答案。
以下代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<climits>
#include<queue>
#include<cmath>
#include<algorithm>
#define LL long long
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=3e3+50;
void clr(deque<LL> &q)
{
while(!q.empty())
q.pop_front();
}
void ins(deque<LL> &q,LL v)
{
<