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]修筑绿化带(单调队列)的更多相关文章
- 洛谷.2219.[HAOI2007]修筑绿化带(单调队列)
题目链接 洛谷 COGS.24 对于大的矩阵可以枚举:对于小的矩阵,需要在满足条件的区域求一个矩形和的最小值 预处理S2[i][j]表示以(i,j)为右下角的C\(*\)D的矩阵和, 然后对于求矩形区 ...
- luogu 2219[HAOI2007]修筑绿化带 单调队列
Code: #include<bits/stdc++.h> using namespace std; #define setIO(s) freopen(s".in",& ...
- 洛谷P2219 [HAOI2007]修筑绿化带(单调队列)
传送门 啧……明明以前做到过这种类型的题结果全忘了…… 这种矩阵的,一般都是先枚举行,然后对列进行一遍单调队列,搞出右下角在每一行中合法位置时的最小权值 再枚举列,对行做一遍单调队列,用之前搞出来的最 ...
- P2219 [HAOI2007]修筑绿化带
我是题面 这道题跟理想的正方形很像,不大明白蛤OI是怎么想的,一年出两道这么相近的题 这道题有两个矩形,所以就有了两种做法(说是两种做法,其实只是维护的矩形不同) 一种是维护大矩形,一种是维护小矩形, ...
- [luoguP2219] [HAOI2007]修筑绿化带(单调队列)
传送门 需要n*m的算法,考虑单调队列 可以预处理出来 a[i][j]表示以i,j为右下角的绿化带+花坛的和 b[i][j]表示以i,j为右下角的花坛的和 那么我们可以单调队列跑出来在A-C-1,B- ...
- 洛谷2219:[HAOI2007]修筑绿化带——题解
https://www.luogu.org/problemnew/show/P2219#sub 为了增添公园的景致,现在需要在公园中修筑一个花坛,同时在画坛四周修建一片绿化带,让花坛被绿化带围起来. ...
- [HAOI2007] 修筑绿化带
类型:单调队列 传送门:>Here< 题意:给出一个$M*N$的矩阵,每一个代表这一格土地的肥沃程度.现在要求修建一个$C*D$的矩形花坛,矩形绿化带的面积为$A*B$,要求花坛被包裹在绿 ...
- luogu2219 [HAOI2007]修筑绿化带
和「理想的正方形」比较相似,需要先掌握那道题. 花坛外头每一边必须套上绿化带 #include <iostream> #include <cstdio> using names ...
- [HAOI2007]修筑绿化带 题解
题意分析 给出一个 $m*n$ 的矩阵 $A$ ,要求从中选出一个 $a*b$ 的矩阵 $B$ ,再从矩阵 $B$ 中选出一个 $c*d$ 的矩阵 $C$ ,要求矩阵 $B,C$ 的边界不能重合,求矩 ...
随机推荐
- matplot绘图
import matplotlib.pyplot as pltimport numpy as npimport matplotlib # 设置matplotlib正常显示中文和负号matplotlib ...
- nginx 长连接keeplive
发现后台日志打印太多 FD打开太多的日志. 处理思路: 修改nginx upstream的长连接 http://blog.csdn.net/gzh0222/article/details/852363 ...
- Eclipse + Maven 安装配置
1. 下载 http://maven.apache.org/download.cgi 2. 解压 3. 配置环境变量 MAVEN_HOME = D:\Software\apache-maven-3.5 ...
- jenkins 添加 证书凭证Credentials
jenkins 添加 证书凭证Credentials 大家都知道jenkins在拉取git项目代码的时候,如果没有配置 “证书凭证Credentials” 或者配置的不对, 就会出现红色报错,最终导致 ...
- vue中动态绑定class
我用的element-ui primary默认是这个颜色,ui设计的是这个颜色所以我们先要重写 .el-button--primary的样式 因为默认是没有勾选的所有事灰色所以下面重写样式为灰色 .e ...
- filename
package com.enjoyor.soa.traffic.server.tms.controller; import java.io.BufferedReader;import java.io. ...
- aop编程之后置通知,环绕通知和异常通知
---恢复内容开始--- 此将实例将在上一讲前置通知的基础上进行配置,前置配置内容:http://www.cnblogs.com/lihuibin/p/7955947.html 具体流程如下: 1. ...
- tp连贯操作
链接数据库 首先写配置文件 复制concentration.php中的 /* 数据库设置 */ 'DB_TYPE' => '', // 数据库类型 'DB_HOST' => '', // ...
- 前端-CSS样式
一.CSS介绍 CSS(Cascading Style Sheet),全称层叠样式,定义如何显示HTML内的元素,浏览器读取HTML文件时,读取到CSS样式时根据CSS规则来对内容进行渲染 1.CSS ...
- pyinstaller将python脚本生成exe
一.下载pyinstaller 二.生成exe 下载pyinstaller 1.在C:\python27\Scripts目录下打开cmd界面,执行命令:pip install PyInstaller ...