CF #574 (Div. 2) E. OpenStreetMap(单调队列)

题意:

根据公式得到一个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)
{
   
    <
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值