和「理想的正方形」比较相似,需要先掌握那道题。

花坛外头每一边必须套上绿化带

#include <iostream>
#include <cstdio>
using namespace std;
int n, m, a, b, c, d, qwq[1005], twq, hwq, zzxz[1005][1005], ans;
int r[1005][1005], hzxz[1005][1005], cd[1005][1005], ab[1005][1005];
int main(){
cin>>n>>m>>a>>b>>c>>d;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++){
scanf("%d", &r[i][j]);
r[i][j] += r[i-1][j] + r[i][j-1] - r[i-1][j-1];
}
for(int i=1; i<=n-c+1; i++)
for(int j=1; j<=m-d+1; j++){
int k=i+c-1;
int l=j+d-1;
cd[i][j] = r[k][l] - r[i-1][l] - r[k][j-1] + r[i-1][j-1];//计算所有c*d区域的和
}
for(int i=1; i<=n-a+1; i++)
for(int j=1; j<=m-b+1; j++){
int k=i+a-1;
int l=j+b-1;
ab[i][j] = r[k][l] - r[i-1][l] - r[k][j-1] + r[i-1][j-1];
}
a -= 2 + c - 1;//a*b的区域,是(a-2)*(b-2)的区域能放,然后再抛去c*d的大小带来的影响,就成了寻找一定区域内的最小值(因为要枚举a*b区域左上角,然后用单调队列迅速求出它所对应的(a-2)*(b-2)区域内的c*d区域的和的最小值),这样就方便了处理
b -= 2 + d - 1;
n -= c - 1;//这个矩阵就变成了所有c*d区域的和的矩阵
m -= d - 1;
for(int i=1; i<=n; i++){
hwq = 1;
twq = 0;
for(int j=1; j<=m; j++){
int t=max(1, j-b+1);
while(hwq<=twq && qwq[hwq]<=j-b) hwq++;
while(hwq<=twq && cd[i][qwq[twq]]>cd[i][j]) twq--;
qwq[++twq] = j;
hzxz[i][t] = cd[i][qwq[hwq]];
}
}
for(int i=1; i<=m-b+1; i++){
hwq = 1;
twq = 0;
for(int j=1; j<=n; j++){
int t=max(1, j-a+1);
while(hwq<=twq && qwq[hwq]<=j-a) hwq++;
while(hwq<=twq && hzxz[qwq[twq]][i]>hzxz[j][i]) twq--;
qwq[++twq] = j;
zzxz[t][i] = hzxz[qwq[hwq]][i];
}
}
n += c - 1;
m += d - 1;
a += 2 + c - 1;
b += 2 + d - 1;
for(int i=1; i<=n-a+1; i++)
for(int j=1; j<=m-b+1; j++)
ans = max(ans, ab[i][j]-zzxz[i+1][j+1]);
cout<<ans<<endl;
return 0;
}

luogu2219 [HAOI2007]修筑绿化带的更多相关文章

  1. P2219 [HAOI2007]修筑绿化带(单调队列)

    P2219 [HAOI2007]修筑绿化带 二维单调队列 写了这题 P2216 [HAOI2007]理想的正方形  后,你发现可以搞个二维单调队列 来保存矩形(i+1,i+A-1)(j+1,j+B-1 ...

  2. 洛谷2219:[HAOI2007]修筑绿化带——题解

    https://www.luogu.org/problemnew/show/P2219#sub 为了增添公园的景致,现在需要在公园中修筑一个花坛,同时在画坛四周修建一片绿化带,让花坛被绿化带围起来. ...

  3. [HAOI2007] 修筑绿化带

    类型:单调队列 传送门:>Here< 题意:给出一个$M*N$的矩阵,每一个代表这一格土地的肥沃程度.现在要求修建一个$C*D$的矩形花坛,矩形绿化带的面积为$A*B$,要求花坛被包裹在绿 ...

  4. [luoguP2219] [HAOI2007]修筑绿化带(单调队列)

    传送门 需要n*m的算法,考虑单调队列 可以预处理出来 a[i][j]表示以i,j为右下角的绿化带+花坛的和 b[i][j]表示以i,j为右下角的花坛的和 那么我们可以单调队列跑出来在A-C-1,B- ...

  5. 洛谷.2219.[HAOI2007]修筑绿化带(单调队列)

    题目链接 洛谷 COGS.24 对于大的矩阵可以枚举:对于小的矩阵,需要在满足条件的区域求一个矩形和的最小值 预处理S2[i][j]表示以(i,j)为右下角的C\(*\)D的矩阵和, 然后对于求矩形区 ...

  6. P2219 [HAOI2007]修筑绿化带

    我是题面 这道题跟理想的正方形很像,不大明白蛤OI是怎么想的,一年出两道这么相近的题 这道题有两个矩形,所以就有了两种做法(说是两种做法,其实只是维护的矩形不同) 一种是维护大矩形,一种是维护小矩形, ...

  7. 洛谷P2219 [HAOI2007]修筑绿化带(单调队列)

    传送门 啧……明明以前做到过这种类型的题结果全忘了…… 这种矩阵的,一般都是先枚举行,然后对列进行一遍单调队列,搞出右下角在每一行中合法位置时的最小权值 再枚举列,对行做一遍单调队列,用之前搞出来的最 ...

  8. luogu 2219[HAOI2007]修筑绿化带 单调队列

    Code: #include<bits/stdc++.h> using namespace std; #define setIO(s) freopen(s".in",& ...

  9. [HAOI2007]修筑绿化带 题解

    题意分析 给出一个 $m*n$ 的矩阵 $A$ ,要求从中选出一个 $a*b$ 的矩阵 $B$ ,再从矩阵 $B$ 中选出一个 $c*d$ 的矩阵 $C$ ,要求矩阵 $B,C$ 的边界不能重合,求矩 ...

随机推荐

  1. 開玩樹莓派(二):配置IP,實現無顯示器局域網內Putty連接和RDP遠程

    目錄: 開玩樹莓派(一):安裝Raspbian系統 開玩樹莓派(二):配置IP,實現無顯示器局域網內Putty連接和RDP遠程 開玩樹莓派(三):Python編程 開玩樹莓派(四):GPIO控制和遠程 ...

  2. echarts 添加Loading 等待。

    capturedsDetailsEcharts: function(id) { if (!id) { id = mini.get("chnNameCaptureds").getVa ...

  3. let和const注意点

    let 一.块级作用域 下面的代码如果使用var,最后输出的是10. var a = []; for (var i = 0; i < 10; i++) { a[i] = function () ...

  4. ls参数

    -a 全部文件 -A 与a差不多,但是不包括.和..开头的两个目录 -d 仅列出目录 -f 直接列出结果,不进行排序 -h 列出文件大小 -i 列出inode的位置,而非列出文件属性 -l 列出长数据 ...

  5. FusionCharts 3.2.1 常用用法

    一.XML格式 1.实例化一个FusionCharts 对象 var member_fund_count_pie = new FusionCharts("FusionCharts3.2.1/ ...

  6. MySQL 导出一句话

    听说是很老的东西了,学习的时候发现还是很好用的,故学习转载过来,留备学习. mysql 导出一句话 方法1:网上流行的方法 流程:(1)建表--->(2)插入数据--->(3)select ...

  7. UVA 753 A Plug for UNIX (最大流)

    关键在建图,转换器连一条容量无限的边表示可以转化无数次,设备的插头连源点,插座连汇点. dinic手敲已熟练,输出格式又被坑,总结一下,输出空行多case的,一个换行是必要的,最后一个不加空行,有Te ...

  8. WPF知识点全攻略10- 路由事件

    路由事件是WPF不得不提,不得不会系列又一 先来看一下他的定义: 功能定义:路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理程序的事件. 实现定义:路由事件是一个 C ...

  9. BCB:内存泄漏检查工具CodeGuard

    一.为什么写这篇东西 自己在使用BCB5写一些程序时需要检查很多东西,例如内存泄漏.资源是否有释放等等,在使用了很多工具后,发觉BCB5本身自带的工具―CodeGuard,非常不错,使用也挺方便的,但 ...

  10. 快速幂&&矩阵快速幂

    快速幂 题目链接:https://www.luogu.org/problemnew/show/P1226 快速幂用了二分的思想,即将\(a^{b}\)的指数b不断分解成二进制的形式,然后相乘累加起来, ...