P2219 [HAOI2007]修筑绿化带

二维单调队列

写了这题 P2216 [HAOI2007]理想的正方形  后,你发现可以搞个二维单调队列

来保存矩形(i+1,i+A-1)(j+1,j+B-1)内矩形C*D的最小值

具体怎么搞呢

先搞出二维前缀和

蓝后先按$x$轴跑一遍单调队列,再按$y$轴跑一遍就好辣

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
inline int Max(int a,int b){return a>b?a:b;}
#define N 1005
int n,m,A,B,C,D,s[N][N],h[N],L,R,ans;
int w1[N][N],w2[N][N],a1[N][N],a2[N][N];
int main(){
scanf("%d%d%d%d%d%d",&n,&m,&A,&B,&C,&D);
register int i,j;
for(i=;i<=n;++i)
for(j=;j<=m;++j){
scanf("%d",&s[i][j]);
s[i][j]+=s[i-][j]+s[i][j-]-s[i-][j-];
}//前缀和
for(i=A;i<=n;++i)
for(j=B;j<=m;++j)
w1[i][j]=s[i][j]-s[i-A][j]-s[i][j-B]+s[i-A][j-B];//A*B矩阵的和
for(i=C+;i<n;++i)
for(j=D+;j<m;++j)
w2[i][j]=s[i][j]-s[i-C][j]-s[i][j-D]+s[i-C][j-D];//C*D矩阵的和
for(i=C+;i<n;++i){
L=,R=;
for(j=D+;j<m;++j){
while(L<=R&&h[L]<j-B++D) ++L;
while(L<=R&&w2[i][h[R]]>=w2[i][j]) --R;
h[++R]=j;
a1[i][j]=w2[i][h[L]];
}
}//先处理出x轴上的最小值
for(j=D+;j<m;++j){
L=,R=;
for(i=C+;i<n;++i){
while(L<=R&&h[L]<i-A++C) ++L;
while(L<=R&&a1[h[R]][j]>=a1[i][j]) --R;
h[++R]=i;
a2[i][j]=a1[h[L]][j];
}
}//再按y轴跑一遍单调队列
for(i=A;i<=n;++i)
for(j=B;j<=m;++j)
ans=Max(ans,w1[i][j]-a2[i-][j-]);//取最小的C*D矩阵的值
printf("%d",ans);
return ;
}

P2219 [HAOI2007]修筑绿化带(单调队列)的更多相关文章

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

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

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

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

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

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

  4. P2219 [HAOI2007]修筑绿化带

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

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

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

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

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

  7. [HAOI2007] 修筑绿化带

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

  8. luogu2219 [HAOI2007]修筑绿化带

    和「理想的正方形」比较相似,需要先掌握那道题. 花坛外头每一边必须套上绿化带 #include <iostream> #include <cstdio> using names ...

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

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

随机推荐

  1. 第二弹:超全Python学习资源整理(进阶系列)

    造一个草原要一株三叶草加一只蜜蜂.一株三叶草,一只蜂,再加一个梦.要是蜜蜂少,光靠梦也行. - 狄金森 "成为编程大牛要一门好语言加一点点天分.一门好语言,一点点天分,再加一份坚持.要是天分 ...

  2. [LeetCode] 35. Search Insert Position_Easy tag: Binary Search

    Given a sorted array and a target value, return the index if the target is found. If not, return the ...

  3. iOS 新浪微博-3.0 新特性

    每个程序在第一次启动的时候,都会显示新特性.效果如下: 思路: 添加一个ViewController,里面放两个View,一个是UISrollView,另一个pageControl 往UISrollV ...

  4. Appium遇到的问题二(持续更新....)

    Python版: 1.运行Appium遇到的错误:此问题是由于JDK版本要在1.7及以上. Android开发要求. A new session could not be created. C:\Py ...

  5. Oracle如何重启mmon/mmnl进程(AWR自动采集)

    环境:Oracle 11.2.0.4 RAC 现象:sysaux空间满导致无法正常生成快照,清理空间后,手工生成快照可以成功,但是观察自动生成快照依然是不成功. 之前了解到awr对应的相关后台进程是m ...

  6. spring注解式开发之视图解析器

    http://localhost:8089/springmvc-04-viewResovler/springmvc/hello

  7. CentOS下挂载数据盘

    CentOS下挂载数据盘 1.显示磁盘使用情况:#df 2.显示磁盘:#fdisk -l 3.格式化分区:#mkfs.ext4 /dev/vdb1           //注:将/dev/vdb1格式 ...

  8. Python记录8:函数的嵌套

    #函数的嵌套分为两类:# 1.函数的嵌套定义: 在函数内部又定义了一个函数# def foo():# x=1# # print(x)# def bar():# print('from bar')## ...

  9. html5-css综合练习

    div{    width: 600px;    height: 800px;    padding: 40px;    font-size: 12px;    line-height: 25px;  ...

  10. html5-边框属性

    width: 500px;    height: 300px;    background: rgb(122,30,60);    border: 10px solid black;    /*bor ...